htaccess添加www重写失效及内部重写问题的修复方案咨询
问题修复方案
问题根源
你的.htaccess里,内部路由转发规则(article/info/admin/index的RewriteRule)放在了HTTPS和WWW重定向规则之前,而且这些路由规则都带了[L]标记(表示匹配后停止执行后续规则)。当访问带多级路径的URL时,请求先被匹配到路由转发规则,直接跳转到对应的PHP文件,后面的HTTPS/WWW重定向规则根本没机会触发。而首页请求没触发前面的路由规则,所以能正常走到后面的重定向逻辑。
修复后的完整.htaccess配置
RewriteEngine On # 先执行HTTPS与WWW强制重定向(移至最前面) # 强制跳转至HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 强制添加WWW前缀 RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 内部路由转发规则(放在重定向之后) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^article/?(.*)$ article.php?$1 [L,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^info/?(.*)$ info.php?$1 [L,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^admin/?(.*)$ admin.php?$1 [L,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?$1 [L,QSA]
关键修改说明
- 调整规则顺序:把HTTPS和WWW的重定向规则移到所有内部路由规则前面,确保所有请求先完成域名和协议的标准化,再处理内部转发逻辑。
- 优化重定向写法:用
%{REQUEST_URI}代替$1,避免正则匹配时的路径截断问题;HTTPS判断改用!=on,兼容更多服务器环境。 - 移除冗余条件:删除了原路由规则中多余的
RewriteCond %{REQUEST_FILENAME} !^(article/?).*$类条件,因为RewriteRule已经匹配了对应路径,只要!-f(不是文件)和!-d(不是目录)的条件满足,就会执行转发,无需额外排除自身路径。
测试注意事项
修改完成后,务必清除浏览器缓存或使用隐私模式测试,避免旧的301重定向缓存干扰结果。
内容的提问来源于stack exchange,提问作者RoTak
相关产品推荐
相关产品推荐

