用 try_files 实现多语言站点兜底,核心是预提语言变量 $lang 后按序匹配路径:/zh/index.html → /zh/index.htm → /en/index.html → /index.html → 404;需配合 map 提取 Accept-Language、合理规划文件结构及 location 配置。

直接用 try_files 实现多语言站点的文件兜底,核心不是靠它“识别语言”,而是让它按语言变量拼出路径,逐级尝试本地文件,最后落到默认页或报错。关键在于把语言信息提前提取好,再让 try_files 按顺序查。
先用 map 提取语言标签
在 http 块里定义语言映射,从 Accept-Language 头中提取主语言:
-
~*^zh-cn|zh-sg|zh-hans zh;→ 中文简体用户匹配zh -
~*^zh-tw|zh-hk zh-hant;→ 繁体用户匹配zh-hant -
~*^en-us|en-gb en;→ 英文用户匹配en -
default en;→ 兜底为英文
这样就得到一个可用的变量 $lang,比如值可能是 zh 或 en。
在 location 中用 try_files 按语言路径查找
把 $lang 插入路径,让 Nginx 优先找对应语言的首页文件:
try_files /$lang/index.html /$lang/index.htm /en/index.html /index.html =404;
含义是:先找 /zh/index.html(如果用户是中文),找不到就试 /zh/index.htm,再不行就退到英文版 /en/index.html,最后 fallback 到根目录的 /index.html。所有路径都不存在时返回 404。
注意:确保你的文件结构与路径一致,例如 /var/www/site/zh/index.html 必须真实存在,否则会跳过。
配合 root 和子目录索引更稳妥
如果你的多语言内容放在不同子目录下(如 /zh/、/en/),可以在对应 location 块里设 root 和 index:
location /zh/ { root /var/www/site; index index.html; }location /en/ { root /var/www/site; index index.html; }
这样访问 /zh/ 时,Nginx 自动在 /var/www/site/zh/ 下找 index.html。而根路径 / 仍由前面的 try_files 控制,实现自动分流+兜底双保障。
避免 rewrite 干扰静态资源
如果同时用了语言跳转(比如访问 / 自动 302 到 /zh/),要防止 CSS、JS、图片等静态请求也被重定向:
- 把跳转逻辑写在更精确的
location /块里,不要放全局 - 加条件限制,例如只对
text/html类型或无扩展名请求跳转 - 或者直接放弃跳转,用
try_files静态匹配,对用户体验影响更小
静态资源本身不依赖语言判断,应直通服务,不该参与语言路由逻辑。


















