必须用 try_files 配合 $lang 变量实现语言化首页加载,index 指令仅支持静态文件名;通过 map 从 accept-language 提取 $lang,在 location / 中按 /$lang/index.html → /index.html 顺序匹配。

直接用 index 指令无法按语言动态加载首页,它只支持静态文件名列表。要实现“优先加载 /zh/index.html 或 /en/index.html 这类带语言后缀的首页”,必须配合 try_files + 变量(如 $lang)来实现路径级优先匹配。
核心思路:用 try_files 替代 index,按语言变量拼路径
index 是被动匹配当前目录下的固定文件名;而 try_files 能主动构造路径并逐个检查是否存在。只要提前设置好语言变量(比如通过 cookie、header 或 URL 参数),就能让 Nginx 按需尝试语言子目录下的首页。
- 确保
$lang已定义(常见方式:用map指令从$http_accept_language或$cookie_lang提取) - 在
location /块中使用try_files,优先尝试/$lang/index.html - 失败后降级到通用首页,例如
/index.html或返回 404
典型配置示例
以下配置放在 server 块内的 location / 中:
location / {
# 先尝试语言子目录下的首页
try_files /$lang/index.html /$lang/index.htm /index.html =404;
}
假设 $lang 的值是 zh,Nginx 会依次检查:
→ /var/www/site/zh/index.html(存在则直接返回)
→ /var/www/site/zh/index.htm(不存在则跳过)
→ /var/www/site/index.html(兜底)
语言变量怎么来?用 map 提前定义
不能直接用未声明的 $lang。需在 http 块顶部添加映射规则:
map $http_accept_language $lang {
~*zh.* zh;
~*en.* en;
default en;
}
这样当请求头包含 Accept-Language: zh-CN,zh;q=0.9 时,$lang 就自动设为 zh,后续 try_files 才能正确拼路径。
注意目录结构和权限
该方案依赖真实存在的文件路径:
- 确保网站根目录下有对应语言子目录,例如
/var/www/site/zh/index.html - Nginx 工作进程需对这些路径有读取权限(常见错误:403 Forbidden)
- 不要把
index指令和这个逻辑混用——它在这里不起作用,删掉或注释掉更清晰











