根目录与站点目录htaccess规则冲突导致不带www域名无法访问如何解决
规则运行逻辑与生效优先级
Apache的.htaccess规则按照目录从上到下的顺序执行,服务器根目录的规则优先级高于站点子目录的规则,所以cPanel生成的根目录规则会先运行,再执行你写在站点目录的规则。
你遇到的冲突运行流程如下:
- 用户访问
mydomain.com,首先匹配根目录cPanel规则:满足HTTP_HOST为mydomain.com的条件,临时把请求指向https://www.mydomain.io/mydomain(也就是你这个站点对应的子目录托管路径) - 请求流转到站点子目录后,匹配你写的强制www规则:当前
HTTP_HOST还是不带www的mydomain.com,触发跳转逻辑,拼接路径时错误把托管路径也拼入了新域名后缀,最终生成https://www.example.com/example.com/的异常地址。
配置错误点
- 没有考虑父目录规则的优先级影响,你写的跳转规则没有限定专属域名,路径拼接逻辑没有适配cPanel附加域的转发规则
- 跳转规则默认使用HTTP协议,如果你的站点已经开启HTTPS强制,会额外触发一次跳转,也可能和全局HTTPS规则冲突
- 301是永久重定向,浏览器会长期缓存旧的跳转结果,配置修改后如果不清理缓存会持续复现错误
标注do not edit的规则是否可删除
不建议直接删除这段规则。这段是cPanel添加的附加域转发规则,用来把你绑定的mydomain.com请求转发到对应的子站点目录,如果你直接删除,后续cPanel更新配置时会自动重新生成,同时删除后mydomain.com的请求会直接走到服务器主站点的内容,无法正常加载你的站点。
如果要调整根目录跳转的目标路径,直接到cPanel后台「附加域」板块找到对应域名修改托管目录即可,不需要手动修改根目录.htaccess。
修复方案
把站点子目录的.htaccess跳转规则替换为以下内容,避免路径拼接错误:
RewriteEngine on # 仅匹配你的根域名,防止影响其他绑定域名 RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC] # 直接跳转到带www的HTTPS地址,规避路径拼接问题 RewriteRule ^(.*)$ https://www.mydomain.com/$1 [R=301,L]
修改完成后清理浏览器缓存或者用无痕模式测试即可。
内容的提问来源于stack exchange,提问作者Compoot
相关产品推荐
相关产品推荐

