移除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
相关产品推荐
相关产品推荐

