nginx多语言站点通过正则捕获语言前缀(如/zh/)、map匹配accept-language、rewrite重写路径、301补全默认语言,并过滤重复前缀与多余斜杠,实现seo友好、零后端依赖的入口层路由。

在 Nginx 中配置多语言站点的 URL 路径重写与重定向,核心是识别语言标识(如 /zh/、/en/、/ja/),将其映射到对应语言内容,同时兼顾 SEO 友好性、默认语言处理和路径一致性。不依赖后端路由,全部由 Nginx 在入口层完成解析与分发。
识别并提取语言前缀
用正则捕获路径开头的语言代码,确保只匹配合法两字母或三字母语言标签(如 zh、en-us、pt-br),避免误匹配其他路径。
- 在
server块中使用location ~ ^/([a-z]{2}(-[a-z]{2})?)/捕获语言段,$1 是主语言(如zh),$2 是可选区域(如-cn) - 配合
set $lang $1;将语言存为变量,供后续规则或 proxy_pass 使用 - 注意:不要用
location /zh/这类静态块,否则需为每种语言单独写一个 location,难以维护
将带语言前缀的请求内部重写为后端可处理路径
保持浏览器地址栏显示 /zh/about,但实际把请求转发给后端时去掉前缀,或改写为带参数的形式(如 /about?lang=zh)。
- 用
rewrite ^/[a-z]{2}(-[a-z]{2})?/(.*)$ /$2?lang=$1 break;—— 把/zh/contact改成/contact?lang=zh,break防止重复匹配 - 若后端通过子目录区分语言(如
/var/www/site/zh/),可用root /var/www/site/$lang;+try_files $uri $uri/ /$lang/index.html; - 对 SPA 应用(如 Vue/React),推荐保留语言前缀,用
try_files $uri $uri/ /$lang/index.html;确保前端路由不 404
自动补全默认语言并重定向
当用户访问根路径(/)或无语言前缀路径(/products)时,应根据 Accept-Language 请求头或硬编码默认语言(如 zh)做 301 重定向,保证语义清晰和 SEO 统一。
- 用
map指令预定义语言映射:map $http_accept_language $preferred_lang {<br> ~*zh-cn|zh-sg|zh-hk|zh-mo "zh";<br> ~*en-us|en-gb|en-ca "en";<br> default "zh";<br>} - 在
location = /或location /中:if ($request_uri = "/") { return 301 /$preferred_lang/; }if ($uri !~ ^/[a-z]{2}(-[a-z]{2})?/) { return 301 /$preferred_lang$uri; } - 注意:
if在 location 外不生效,且避免在location /内滥用 —— 优先用try_files+map组合替代复杂判断
统一语言路径格式并防止重复跳转
避免出现 /zh/zh/about 或 //about 这类异常路径,需过滤非法嵌套和多余斜杠。
- 加一条前置规则拦截重复语言前缀:
location ~ ^/([a-z]{2}(-[a-z]{2})?)/([a-z]{2}(-[a-z]{2})?)/(.*)$ { return 301 /$1/$4; } - 用
merge_slashes on;(默认开启)自动合并连续斜杠,如//about→/about - 对已含查询参数的 URL 做重定向时,用
$is_args$args保留原参数:return 301 /$preferred_lang$uri$is_args$args;











