如何搭配现有htaccess规则正确移除URL末尾的尾部斜杠
最优实现方案
你之前的规则不生效的核心原因是规则放置顺序错误,需要将移除尾部斜杠的逻辑放在HTTPS/WWW强制跳转规则之后、转发到index.php的前端控制器规则之前,才能避免被后续转发规则拦截,修改后的完整.htaccess规则如下:
# 强制WWW前缀 RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] # 强制HTTPS RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 新增:移除非真实目录URL的尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ /$1 [R=301,L] # 前端控制器:不存在的资源转发到index.php RewriteRule ^$ index.php?/ [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?/$1 [QSA,L]
规则说明
- 保留了
!-d判断条件,确保服务器真实存在的目录仍然可以正常访问,不会被移除尾部斜杠 - 跳转规则放在域名/协议校验之后,避免产生多余的多次跳转,所有重定向逻辑执行完成后才会进入转发到index.php的逻辑
- 测试阶段建议先将
R=301改为R=302使用临时跳转,避免浏览器缓存错误的跳转规则,确认生效后再改回301永久跳转。
内容的提问来源于stack exchange,提问作者NaughtySquid
相关产品推荐
相关产品推荐

