Nginx 不直接识别或翻译语言,但可通过 Accept-Language 请求头结合 map 指令匹配语言、root 动态设置目录、index 指令查找首页,再用 try_files 实现多级 fallback,实现基于用户偏好的自动语言分流。
Nginx 本身不直接“识别语言”或“自动翻译”,但可以通过 index 指令配合其他模块(如 http_geoip2、map、if 或请求头 Accept-Language)实现基于用户语言偏好的首页自动分流。关键在于:不是靠 index 单独完成,而是用它作为最终响应的默认文件名,再结合逻辑决定“该返回哪个 index 文件”。
浏览器在请求时会带上 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-hanszh;~*zh-tw|zh-hk|zh-hantzh-hant;~*en-us|en-gb|en en;~*ja ja;~*ko ko;defaulten;}$lang 设置 root 并指定 index 文件:location / {root /var/www/multi-lang;set $base_dir "/$lang";root /var/www/multi-lang$base_dir;# index 指令在这里生效:访问 / → 尝试找 index.html、index.htm 等index index.html index.htm;
}
此时,请求根路径时,Nginx 会进入对应语言子目录(如 /var/www/multi-lang/zh/),再按 index 指令查找 index.html —— 实现“自动选语言首页”。
仅靠 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 到 defaulttry_files $lang_dir/index.html /en/index.html /default/index.html =404;}这样既利用了 index 的语义(隐式找首页),又避免因某语言缺失导致 404,提升健壮性。
index 指令只在 Nginx 判定请求的是一个“目录”时才触发(即 URI 以 / 结尾,或内部重写为目录路径)。若请求是 /,且 root 下有对应子目录,它才会去该子目录里找 index.html。
index 和 try_files 混用在同一 location 中——try_files 优先级更高,会绕过 index
rewrite 或 return 提前响应,index 不会执行当 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)处理,保持配置清晰