如何在.htaccess中移除.php/.png扩展名后的尾随斜杠?
解决.htaccess添加尾随斜杠后出现.php/和.png/的问题
我来帮你搞定这个问题——你遇到的.php/和.png/后缀带斜杠的情况,是因为初始的加尾斜杠规则没排除这类特定扩展名的资源,哪怕它们是文件(或者文件不存在时)都会被加上斜杠。我们可以从源头避免和修正错误路径两个方向解决,顺便给你调整好现有规则的顺序,避免冲突:
一、先从源头禁止给特定扩展名加尾斜杠
修改你原来的加尾斜杠规则,新增一个条件排除.php和.png结尾的请求,这样就不会生成错误的带斜杠路径了:
# 仅给非文件、且不以.php/.png结尾的路径添加尾随斜杠 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\.(php|png)$ [NC] RewriteRule ^(.*[^/])$ /$1/ [L,R=301]
这里的RewriteCond %{REQUEST_URI} !\.(php|png)$ [NC]意思是:如果请求的URI不是以.php或.png结尾([NC]表示不区分大小写),才执行加尾斜杠的操作。
二、添加规则修正已存在的错误路径
如果已经有.php/或.png/这类错误链接被搜索引擎收录,或者用户不小心访问到了,我们需要用301重定向把它们转成正确的无斜杠路径:
# 移除.php/和.png/末尾的多余斜杠 RewriteRule ^(.*)\.(php|png)/$ /$1.$2 [L,R=301,NC]
这个规则会匹配所有以.php/或.png/结尾的请求,自动去掉末尾的斜杠,比如/image.png/会被重定向到/image.png,/page.php/会被重定向到/page.php。
三、整合到你现有规则的完整配置
规则顺序非常关键:修正错误路径的规则要放在最前面,然后是加尾斜杠的规则,最后再放你原本的其他规则,这样能避免循环重定向或者规则冲突。调整后的完整.htaccess如下:
RewriteEngine On RewriteBase / # 1. 优先修正已存在的.php/和.png/错误路径 RewriteRule ^(.*)\.(php|png)/$ /$1.$2 [L,R=301,NC] # 2. 给符合条件的路径添加尾随斜杠 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\.(php|png)$ [NC] RewriteRule ^(.*[^/])$ /$1/ [L,R=301] # 3. 你的原有规则(保持原有顺序即可) RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^xxx.net [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] AddDefaultCharset utf-8 order allow,deny allow from all deny from 123.249.24.233 RewriteCond %{HTTP_HOST} ^example.com [NC,OR] RewriteCond %{HTTP_HOST} ^example.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301,NC] RewriteCond %{QUERY_STRING} ^$ RewriteCond %{THE_REQUEST} /index\.php RewriteRule ^index\.php https://www.%{HTTP_HOST}/ [R=301,L] RewriteRule ^Index\.php$ /index.php [R=301,L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(html?|php)\ HTTP/ RewriteRule ^index\.(html?|php)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteRule ^index\$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
额外提醒
- 测试前记得清空浏览器缓存,因为301重定向会被浏览器永久缓存,旧的重定向规则可能会影响测试结果。
- 如果之后还遇到其他扩展名的类似问题,只要在两个规则的括号里添加对应的扩展名即可,比如要排除
.jpg,就改成(php|png|jpg)。
内容的提问来源于stack exchange,提问作者Franky2207
相关产品推荐
相关产品推荐

