You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx伪目录转语言查询串重写问题求助

解决Nginx伪目录转语言查询串的404问题

我来帮你排查这个Nginx rewrite的问题——你遇到的404其实是因为正则表达式的匹配逻辑和实际URL结构不匹配,和.php扩展名的关联在于你的规则没有正确捕捉带语言前缀的PHP URL结构。

先看你的原规则:

rewrite "^(/(fr|en))?/(.*).php$" /$3.php?language=$2 last;

当访问/fr/example.php时,这个URL的结构是/[语言]/[文件名].php,但你的正则里,(/(fr|en))?之后跟着一个强制的/——这意味着规则期望的URL是//fr/example.php(多了一个斜杠)或者/example.php(不带语言),而/fr/example.php根本匹配不上这个正则,所以Nginx不会执行重写,直接去查找物理路径/fr/example.php,自然就返回404了。

修正后的解决方案

你可以选择两种方案来修复这个问题,根据自己的偏好选择即可:

方案1:分开处理带语言和不带语言的场景

这种方式逻辑更清晰,便于后续维护:

# 处理带语言前缀的URL:/fr/example.php → /example.php?language=fr
rewrite "^/(fr|en)/(.+)\.php$" /$2.php?language=$1 last;

# 处理不带语言的URL:/example.php → 保持原路径不变
rewrite "^/(.+)\.php$" /$1.php last;

方案2:用单个正则覆盖两种场景

利用非捕获组(?:...)标记可选的语言前缀,避免多余斜杠的问题:

rewrite "^/(?:(fr|en)/)?(.+)\.php$" /$2.php?language=$1 last;

提示:当访问不带语言的URL时,$1会是空值,如果你需要设置默认语言,更推荐在PHP代码里处理(比如判断language参数为空时赋值默认值),这样Nginx规则不会过于复杂。

额外注意事项

  1. 确保这些rewrite规则放在server块内部,或者location / { ... }块中,并且要放在处理PHP请求的location ~ \.php$规则之前,这样重写后的URL才能被正确传递给PHP解析器。
  2. 修改配置后,先用nginx -t检查语法是否正确,再执行systemctl reload nginx(对应你的系统重启命令)让配置生效。
  3. 如果你的PHP环境开启了PATH_INFO相关设置,可能需要微调,但一般情况下上面的规则已经能解决问题。

内容的提问来源于stack exchange,提问作者Jonathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:32