nginx 本身不解析 accept-language 头,但可通过 map 提取语言代码、location 跳转至语言子目录(如 /zh/)、alias 指向对应静态资源目录,并配合 try_files 和缓存策略实现多语言自动切换。

Nginx 本身不解析浏览器语言偏好,也不能直接根据 Accept-Language 头自动选文件,但可以通过组合配置实现静态资源的多语言自动切换——核心是提取语言标识、映射路径、精准服务对应资源。
用 map 提取并标准化语言代码
在 http 块中定义语言映射规则,把原始请求头中的各种变体(如 zh-CN、zh-TW、en-US)归一为简短标识:
-
~*zh-cn|zh-sg|zh-hans|zh-hans-cn zh→ 统一为zh -
~*zh-tw|zh-hant|zh-hk|zh-mo zh-hant→ 区分简繁体 -
~*en-us|en-gb|en-ca en→ 统一为en - 未匹配时设为默认值(如
en),避免空值导致路径错误
根路径自动跳转到语言子目录
用户访问 / 时,不返回通用页,而是立即 302 跳转到对应语言路径,确保后续请求天然带语言上下文:
location = / { return 302 /$lang/; }- 跳转后 URL 变为
/zh/或/en/,便于后续alias或root精准定位 - 状态码用
302(临时跳转),方便后期灰度或 A/B 测试;上线稳定后可改301
按语言前缀路由到对应静态目录
对 /zh/、/en/ 等路径,用 alias 指向独立语言资源目录,隔离各版本文件:
location ~ ^/(zh|zh-hant|en|ja)/$ { alias /var/www/site/$1/; index index.html; }- 每个语言目录下放完整静态结构(
js/、css/、images/等),避免跨目录引用混乱 - 配合
try_files $uri $uri/ /$1/index.html;支持前端路由(如 Vue Router history 模式)
兜底与缓存优化
防止语言目录缺失导致 404,同时提升首屏加载速度:
- 在语言 location 内加
try_files $uri $uri/ =404;,确保只服务该语言目录内真实存在的资源 - 对
index.html启用add_header Cache-Control "no-cache";,避免语言跳转被 CDN 缓存成固定版本 - 静态资源(JS/CSS/图片)可设长缓存(
Cache-Control: public, max-age=31536000),因文件名通常带哈希











