Nginx配置blog路径PHP伪静态跳转异常问题排查
问题根因
两个核心问题导致规则不生效:
- Nginx中带
~修饰符的正则location是严格按照配置文件书写顺序从上到下匹配的,一旦匹配到符合规则的请求就会停止向下查找。你配置的通用路径规则^/([^/]+)/?$写在/blog相关规则的前面,访问/blog/first-article时会被这条规则优先捕获,把first-article作为参数传给device.php,最终出现跳转到domain.tld/first-article的错误。 - 你之前尝试的几组/blog规则本身存在语法和逻辑错误:
- 第一组规则正则开头缺少路径起始的
/,且错误给正则表达式加了多余引号,根本无法匹配到请求路径 - 第二组rewrite规则多写了多余的
?参数,且没有匹配不带尾斜杠的文章路径 - 第三组规则虽然正则写法正确,但因为放在通用规则后面,永远没有匹配生效的机会
- 第一组规则正则开头缺少路径起始的
修正配置
将/blog相关的匹配规则移动到所有通用正则location规则的最前面,保证优先匹配,正确配置如下:
server { # 保留你原有的其他配置... # 注意:blog规则必须放在两个device.php通用规则的上方,优先匹配 location ~ ^/blog/([^/]+)/?$ { try_files $uri $uri/ /blog/read.php?article=$1; } # 原有通用匹配规则,放在blog规则之后即可 location ~ "^/([^/]+)/?$" { try_files $uri $uri/ /device.php?name=$1; } location ~ "^/([^/]+)/([^/]+)/?$" { try_files $uri $uri/ /device.php?name=$1&crversion=$2; } # 保留你原有的其他配置... }
上面的正则已经同时兼容带尾斜杠(如/blog/first-article/)和不带尾斜杠(如/blog/first-article)的访问场景,不需要额外补充规则。
生效操作
- 修改完配置后执行
nginx -t,确认配置语法无错误 - 语法校验通过后执行
nginx -s reload重载配置即可生效 - 访问
domain.tld/blog/first-article验证,不会再出现跳转到根路径的问题
内容的提问来源于stack exchange,提问作者Lup Gabriel
相关产品推荐
相关产品推荐

