Nginx 不直接识别或翻译语言,但可通过 Accept-Language 请求头结合 map 指令匹配语言、root 动态设置目录、index 指令查找首页,再用 try_files 实现多级 fallback,实现基于用户偏好的自动语言分流。

Nginx 本身不直接“识别语言”或“自动翻译”,但可以通过 index 指令配合其他模块(如 http_geoip2、map、if 或请求头 Accept-Language)实现基于用户语言偏好的首页自动分流。关键在于:不是靠 index 单独完成,而是用它作为最终响应的默认文件名,再结合逻辑决定“该返回哪个 index 文件”。
利用 Accept-Language 请求头做语言匹配
浏览器在请求时会带上 Accept-Language 头(例如 zh-CN,zh;q=0.9,en;q=0.8),Nginx 可用 map 指令提取首选语言,并映射到对应目录或文件前缀。
- 在
http块中定义语言映射:
map $http_accept_language $lang {
~*zh-cn|zh-sg|zh-hans zh;
~*zh-tw|zh-hk|zh-hant zh-hant;
~*en-us|en-gb|en en;
~*ja ja;
~*ko ko;
default en;
}- 在 server 块中,根据
$lang设置 root 并指定 index 文件:
location / {
root /var/www/multi-lang;
set $base_dir "/$lang";
root /var/www/multi-lang$base_dir;
<pre class="brush:php;toolbar:false;"># index 指令在这里生效:访问 / → 尝试找 index.html、index.htm 等
index index.html index.htm;}
此时,请求根路径时,Nginx 会进入对应语言子目录(如 /var/www/multi-lang/zh/),再按 index 指令查找 index.html —— 实现“自动选语言首页”。
配合 try_files 实现更灵活的 fallback
仅靠 root + index 无法处理缺失语言版本的情况。推荐用 try_files 配合多级 fallback:
- 结构示例:
/var/www/index/zh/index.html、/var/www/index/en/index.html、/var/www/index/default/index.html - 配置示例:
location / {
set $lang_dir "/$lang";
# 若 zh 目录下无 index.html,尝试 en,最后 fallback 到 default
try_files $lang_dir/index.html /en/index.html /default/index.html =404;
}这样既利用了 index 的语义(隐式找首页),又避免因某语言缺失导致 404,提升健壮性。
注意 index 指令的生效前提
index 指令只在 Nginx 判定请求的是一个“目录”时才触发(即 URI 以 / 结尾,或内部重写为目录路径)。若请求是 /,且 root 下有对应子目录,它才会去该子目录里找 index.html。
- 确保目录存在且有读取权限(否则报 403)
- 不要把
index和try_files混用在同一 location 中——try_files优先级更高,会绕过index - 若用
rewrite或return提前响应,index不会执行
进阶:结合 GeoIP2 做地域+语言联合判断
当 Accept-Language 不可靠(如海外华人用中文浏览器),可引入 ngx_http_geoip2_module 获取国家码,再叠加规则:
- 先查用户国家(如
$geoip2_data_country_code),再结合浏览器语言,设定优先级策略 - 例如:日本用户 +
Accept-Language: en→ 仍返回ja/index.html;美国用户 +zh→ 返回en/index.html或zh/index.html(视业务而定) - 逻辑建议用
map嵌套或 Lua(OpenResty)处理,保持配置清晰











