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

移除URL中.php后缀的Rewrite规则遇末尾斜杠时触发错误的解决问询

嘿,我完全懂你碰到的这个坑!当URL末尾带斜杠的时候,你的规则会把它拼成/test/.php,这服务器肯定找不到对应的文件啊,不出错才怪。

咱们来拆解一下问题出在哪:你原来的第一条RewriteRule里,当请求是/test/时,$1会被捕获成test/,所以加上.php就变成了test/.php,这显然不是你想要的文件路径。

解决这个问题的关键是先把URL里多余的末尾斜杠处理掉,再进行.php后缀的重写。我给你调整了规则顺序,还加了专门处理末尾斜杠的规则,这样既解决了错误,还能让URL更规范,对SEO也友好。

修改后的完整规则如下:

Options +SymLinksIfOwnerMatch
RewriteEngine on

# 先清理URL里的重复斜杠
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

# 移除非目录请求末尾的斜杠(真实目录比如/blog/会保留斜杠)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

# 将不带.php的请求重写为对应的.php文件
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]

# 当请求的文件/目录都不存在时,fallback到index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

咱们来理一理新规则的执行逻辑:

  • 首先把URL里的重复斜杠(比如//test)改成单斜杠,先把URL标准化
  • 然后检查如果请求的不是真实目录,但末尾带斜杠,就301重定向到不带斜杠的版本(比如/test/ → /test)
  • 接下来再处理.php后缀的重写,这时候$1就不会带末尾斜杠了,自然能正确匹配到test.php
  • 最后才是fallback到index.php的规则,确保不存在的请求能被框架处理

你试试访问example.com/test/,现在会先跳转到example.com/test,然后正常重写为test.php返回内容,不会再出错啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:32:26