多语言路径重写是将带语言标识的URL(如/zh-CN/about)映射到统一后端逻辑并保留lang参数。Nginx通过正则捕获语言代码(如$1),重写为/path?lang=xx;默认语言免前缀,需用rewrite或if补参;静态资源应优先匹配直通;旧路径需301跳转至新格式。

多语言路径重写,核心是把带语言标识的 URL(比如 /zh-CN/about、/en/about)映射到统一后端处理逻辑,同时保持语言参数可被应用识别。Nginx 本身不翻译内容,但能干净地剥离、传递或重写语言前缀。
识别并提取语言代码
用正则捕获语言段,再重写为带查询参数或路径变量的形式。例如:
-
rewrite ^/([a-z]{2}(-[A-Z]{2})?)/(.*)$ /$3?lang=$1 last;—— 匹配/zh-CN/home→ 重写为/home?lang=zh-CN -
rewrite ^/([a-z]{2})/(.*)$ /$2?lang=$1 last;—— 简化版,只匹配如/en/blog→/blog?lang=en
注意:last 让 Nginx 用新 URI 重新匹配 location,适合转发给 PHP/Node.js 等后端;$1 是首组捕获(语言),$2 是后续路径。
默认语言免前缀,其他语言强制带前缀
用户访问 /about 应视为默认语言(如中文),而 /en/about 才走英文逻辑。可这样配置:
- 先排除已带语言前缀的请求:
location ~ ^/[a-z]{2}(-[A-Z]{2})?/专用于多语言路由 - 对根路径和无前缀路径,用
try_files或rewrite补默认 lang:rewrite ^/(.*)$ /$1?lang=zh-CN last;(放在非语言 location 中) - 配合
if ($args !~ lang=)做二次判断,避免重复加参
静态资源与语言路径隔离
避免把 /zh-CN/css/app.css 也重写成带参数的路径——这类文件应直通,不参与语言逻辑:
- 在 location 块中优先匹配静态类型:
location ~* \.(css|js|png|jpg|gif)$ { } - 或用
location ^~ /zh-CN/static/直接 alias 到磁盘目录,跳过 rewrite - 确保语言正则不误伤:把语言匹配写得更精确,比如
^/(zh-CN|en|ja|ko)/而非宽泛的[a-z]+
301 重定向旧语言路径(SEO 友好)
如果老站点用的是 /cn/xxx,现在统一为 /zh-CN/xxx,需做永久跳转:
rewrite ^/cn/(.*)$ /zh-CN/$1 permanent;rewrite ^/en-us/(.*)$ /en/$1 permanent;- 多个旧格式可叠加写,Nginx 按顺序匹配,第一条生效即返回 301
permanent 标志会发 301 响应,浏览器和搜索引擎会缓存新地址,利于权重迁移。


















