Nginx 如何在 Nginx 中配置将国际化多语言站点的根路径自动 302 重定向到默认语言区

作者:袖梨 2026-08-18

直接在 server 块中用 location = / { return 302 /zh/; } 实现根路径 302 跳转至默认语言区,简洁高效;配合 location ~ ^/(en|zh|fr|es)/ 统一处理多语言路由,避免 rewrite 和不精确匹配。

直接在 server 块里用 return 302 指令即可实现根路径自动跳转到默认语言区,比如跳到 /zh//en/,不需复杂判断或 rewrite。

用 return 实现简洁可靠的 302 跳转

这是最轻量、最推荐的方式。Nginx 的 return 指令性能高、语义明确,适合这种固定路径跳转。

  1. 匹配精确的根路径 /,避免影响其他请求
  2. 使用 302 表示临时跳转,符合“默认语言可随时调整”的业务逻辑
  3. 保留原始查询参数(通过 $request_uri),但根路径本身无参数,所以写 /zh/ 即可

配置示例:

location = / {return 302 /zh/;}

配合多语言路由统一处理

根路径跳转后,后续所有带语言前缀的请求(如 /zh//en/)应由同一套规则承接,保持行为一致。

  1. 用正则匹配语言前缀:location ~ ^/(en|zh|fr|es)/
  2. try_files 落地静态文件,例如 try_files $uri $uri/ /$1/index.html
  3. 可选:通过 add_header Content-Language $1 告诉浏览器当前语言

避免常见陷阱

有些写法看似合理,实则容易出错:

  1. 别用 rewrite ^/$ /zh/ redirect —— rewrite 更重,且 redirect 默认是 302,但不如 return 302 直观高效
  2. 别漏掉 = 符号写成 location / { ... } —— 这会匹配所有以 / 开头的路径(如 /api/static),导致误跳
  3. 不要在根跳转里拼接 $request_uri —— 根路径没有子路径,$request_uri 就是 /,加了反而冗余

扩展:按用户偏好自动选语言(可选)

如果希望更智能,可结合 Accept-Language 请求头做简单协商(非强制,仍以 302 跳转为主):

if ($http_accept_language ~* 'zh-CN|zh') {return 302 /zh/;}if ($http_accept_language ~* 'en') {return 302 /en/;}return 302 /zh/;

注意:if 在 location 外可用,但不宜嵌套复杂逻辑;生产环境建议前端或后端做更健壮的语言协商。

相关文章

精彩推荐