直接在 server 块中用 location = / { return 302 /zh/; } 实现根路径 302 跳转至默认语言区,简洁高效;配合 location ~ ^/(en|zh|fr|es)/ 统一处理多语言路由,避免 rewrite 和不精确匹配。
直接在 server 块里用 return 302 指令即可实现根路径自动跳转到默认语言区,比如跳到 /zh/ 或 /en/,不需复杂判断或 rewrite。
这是最轻量、最推荐的方式。Nginx 的 return 指令性能高、语义明确,适合这种固定路径跳转。
/,避免影响其他请求302 表示临时跳转,符合“默认语言可随时调整”的业务逻辑$request_uri),但根路径本身无参数,所以写 /zh/ 即可配置示例:
location = / {return 302 /zh/;}
根路径跳转后,后续所有带语言前缀的请求(如 /zh/、/en/)应由同一套规则承接,保持行为一致。
location ~ ^/(en|zh|fr|es)/
try_files 落地静态文件,例如 try_files $uri $uri/ /$1/index.html
add_header Content-Language $1 告诉浏览器当前语言有些写法看似合理,实则容易出错:
rewrite ^/$ /zh/ redirect —— rewrite 更重,且 redirect 默认是 302,但不如 return 302 直观高效= 符号写成 location / { ... } —— 这会匹配所有以 / 开头的路径(如 /api、/static),导致误跳$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 外可用,但不宜嵌套复杂逻辑;生产环境建议前端或后端做更健壮的语言协商。