Nginx 实现多语言自动跳转需依赖 http 块的 map 指令提取语言标识,server 块负责路由分发;典型场景包括:1. 基于 Accept-Language 的根路径跳转;2. 结合 Cookie 的用户偏好持久化;3. 多语言路径的静态资源服务,须用 alias 而非 root。

Nginx 的 server 块本身不直接支持“根据语言自动跳转”,真正起作用的是配合 http 块中的 map 指令 + server 内的条件响应逻辑。关键不在 server 块写得多复杂,而在于结构分工清晰:map 提前提取语言标识,server 负责路由分发。
下面分三类典型场景说明如何在 server 块中落地多语言自动跳转:
用 Accept-Language 请求头做根路径跳转
这是最常用、对 SEO 友好的方式。
-
map在http块里定义(必须顶层):map $http_accept_language $lang { ~*zh-cn|zh-sg|zh-hans|zh-hans-cn zh; ~*zh-tw|zh-hant|zh-hk|zh-mo zh-hant; ~*en-us|en-gb|en-ca|en-au|en-nz en; ~*ja-jp|ja ja; ~*ko-kr|ko ko; default en; } -
server块中处理/请求:location = / { return 302 /$lang/; }这样访问
https://example.com/时,Nginx 根据浏览器Accept-Language自动跳到/zh/、/en/等路径。上线后可将302改为301提升 SEO 效果。
结合 Cookie 实现用户偏好持久化
适合 Vue/React 等 SPA 首屏语言识别,避免白屏等待 JS 加载。
- 先在
http块中映射 Cookie 值:map $cookie_lang $lang_from_cookie { ~^zh zh; ~^en en; ~^ja ja; ~^ko ko; default en; } -
server块内按优先级判断:location = / { # 有有效 lang Cookie → 直接跳转 if ($cookie_lang ~ ^[a-z]{2}) { return 302 /$lang_from_cookie/; } # 无 Cookie → 退回到 Accept-Language if ($http_accept_language ~ ^(zh|en|ja|ko)) { add_header Set-Cookie "lang=$matches_1; Path=/; Max-Age=31536000; SameSite=Lax"; return 302 /$matches_1/; } # 都没命中 → 默认英语并设 Cookie add_header Set-Cookie "lang=en; Path=/; Max-Age=31536000; SameSite=Lax"; return 302 /en/; }
多语言路径的静态资源服务
跳转过去之后,得让 /zh/、/en/ 这些路径能正确返回对应语言首页。
- 不要用
root拼接,改用alias避免路径错位:location ~ ^/(zh|zh-hant|en|ja|ko)/$ { alias /var/www/site/$1/; index index.html; try_files $uri $uri/ /$1/index.html; }注意:
alias结尾带/,且$1是正则捕获组,确保/zh/映射到/var/www/site/zh/目录;若用root,会变成/var/www/site//zh/,多一层斜杠易出错。
不复杂但容易忽略


















