.htaccess配置异常:无法移除PHP后缀及添加尾部斜杠
解决.htaccess无法移除.php后缀及添加尾部斜杠的问题
你的现有配置存在几个关键问题:
- 重复启用
RewriteEngine On(仅需声明一次即可) - 规则顺序错误:域名跳转(www转非www、HTTPS强制)应放在最前面,内部重写与外部跳转的逻辑顺序颠倒
- 缺少从
.php后缀URL跳转到无后缀加斜杠地址的规则 - 存在重复的尾部斜杠强制规则,导致逻辑冲突
修正后的完整.htaccess配置
# 仅启用一次RewriteEngine RewriteEngine On # 1. 强制HTTPS并跳转www到非www # 处理HTTPS关闭且带www的情况 RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 处理HTTPS关闭但无www的情况 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] # 处理HTTPS开启但带www的情况 RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 2. 外部跳转:移除URL中的.php后缀并添加尾部斜杠 # 匹配带.php的真实请求,跳转到无后缀加斜杠的地址 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+\.php)\ HTTP/ RewriteRule ^(.+)\.php$ /$1/ [R=301,L] # 3. 内部重写:允许无后缀加斜杠的URL加载对应.php文件 # 一级目录:如 example.com/page/ → page.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([^/]+)/$ $1.php [L] # 二级目录:如 example.com/products/item/ → products/item.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([^/]+)/([^/]+)/$ $1/$2.php [L] # 4. 强制尾部斜杠(仅对无后缀的URL生效) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ RewriteRule (.*)$ /$1/ [R=301,L] # 禁止目录浏览 Options -Indexes
关键逻辑说明
- 规则顺序优先:域名跳转规则放在最前面,避免后续重写规则被提前拦截
- 主动跳转处理:通过
%{THE_REQUEST}匹配真实用户请求,确保访问带.php的URL时,会自动跳转到无后缀加斜杠的版本(比如mydomain.com/products/myproduct.php会跳转至mydomain.com/products/myproduct/) - 安全重写校验:内部重写前先检查对应
.php文件是否存在,避免无效请求触发服务器错误 - 精简重复规则:删除了重复的引擎声明和尾部斜杠规则,统一逻辑避免冲突
内容的提问来源于stack exchange,提问作者Shin Chin
相关产品推荐
相关产品推荐

