Nginx 实现多语言路由的核心是用正则 location 匹配语言前缀(如 /zh-CN/)并 rewrite 剥离,再通过 root 或 proxy_pass 分发;需配合前端 router base 设置、SPA 回退(try_files)、默认语言跳转及 Accept-Language 自动重定向。

在 Nginx 中,前端多语言路由(如 /zh-CN/、/en/、/ja/)的自动识别与分发,核心是利用 location 匹配路径前缀 + rewrite 或 try_files 将请求导向对应的静态资源或后端服务,同时确保前端路由(如 Vue Router / React Router 的 history 模式)不被 Nginx 404 中断。关键不是“识别语言”,而是“按语言前缀归类请求并正确透传”。
用正则 location 匹配语言前缀并剥离
最常用且清晰的方式是用带捕获的正则 location ~ ^/([a-z]{2}(-[A-Z]{2})?)/(.*)$ 匹配标准语言标签(如 /zh-CN/home → 捕获 zh-CN 和 home),再通过 rewrite 剥离前缀,让真实资源路径可被正常服务:
-
匹配规则说明:
^/([a-z]{2}(-[A-Z]{2})?)/覆盖en、zh-CN、pt-BR等常见格式;(.*)$捕获剩余路径(含空) -
剥离并重写:
rewrite ^/[a-z]{2}(-[A-Z]{2})?/(.*)$ /$2 break;—— 这样/zh-CN/about变成/about,后续由 root 或 proxy_pass 处理 - 注意:break 不触发新 location 查找,适合静态资源;若需转发到后端 API,可用
proxy_pass http://backend;(此时 rewrite 后的 URI 会自动拼接)
为每种语言配置独立 root(适合静态部署)
若不同语言版本构建在不同子目录(如 /dist/zh-CN/、/dist/en/),可直接用 location + root 隔离:
location ^~ /zh-CN/ { root /var/www/myapp/dist; index index.html; }location ^~ /en/ { root /var/www/myapp/dist; index index.html; }-
关键点:
^~保证前缀匹配优先于正则;root指向的是/dist,所以/zh-CN/js/app.js实际查找/var/www/myapp/dist/zh-CN/js/app.js -
配合前端 router: 必须设置
base: "/zh-CN/"(Vue Router)或basename="/en/"(React Router),否则 JS 请求资源路径会错位
兜底处理:支持无语言前缀的默认语言 & SPA 回退
用户访问 / 或 /product 时,需自动跳转到默认语言(如 /zh-CN/),或直接服务默认语言内容;同时所有非资源请求(HTML 页面)必须返回 index.html,避免前端路由 404:
-
默认语言跳转:
location = / { return 302 /zh-CN/; }(简单跳转)或用try_files直接 serve:try_files $uri $uri/ /zh-CN/index.html; -
SPA 回退统一处理: 在所有语言 location 内或 server 块末尾加:
try_files $uri $uri/ /$1/index.html;(其中$1是正则捕获的语言码),确保/zh-CN/user/123返回/zh-CN/index.html -
静态资源缓存优化: 对
.js、.css、.png等加expires,避免语言前缀影响缓存策略
进阶:结合 Accept-Language 自动重定向(可选)
如果希望首次访问根据浏览器语言自动跳转(如 Chrome 设置为 ja-JP 则跳 /ja/),Nginx 本身不解析 header 语言,但可用 map 提取并重定向:
- 在
http块中定义映射:map $http_accept_language $lang { ~zh-CN zh-CN; ~zh zh-CN; ~en-US en; ~en en; default zh-CN; } - 在
server中:if ($request_uri = "/") { return 302 /$lang/; }(仅对根路径生效,避免循环) -
注意:
if在 location 外使用较安全;不建议对所有请求都重定向,易干扰搜索引擎和书签
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











