非www前缀域名访问返回404的原因排查及rewrite规则调整咨询
问题原因
- 核心原因是重写规则顺序错误:你把非www域名跳转的规则放在了前端控制器(
index.php路由转发)规则的后面,而前端控制器规则带有[L](Last)标记,只要请求对应的不是真实存在的文件/目录,就会命中该规则直接终止后续规则执行,导致非www跳转逻辑永远不会被触发,请求直接交给index.php处理返回404。 - 次要问题:
- 第一条
domain.nl跳转规则跳转到了HTTP版本的www.domain.nl,后续还要再走一次HTTPS跳转,多余的二次跳转还可能引发缓存异常。 - 存在重复的非www跳转逻辑,前后两段规则功能重叠冲突。
- Safari能正常访问大概率是缓存了旧的正确301跳转记录,或者浏览器默认自动补全了www前缀,不代表规则本身正常。
- 第一条
修复方案
调整规则顺序,把所有域名、协议跳转逻辑放在最前面,再放前端控制器路由规则,合并重复的跳转逻辑,修改后的配置如下:
RewriteEngine On RewriteBase / # 统一处理:非www转www + HTTP转HTTPS,一次跳转完成 RewriteCond %{HTTP_HOST} !^www\. [NC,OR] RewriteCond %{HTTPS} !=on RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://www.%1%{REQUEST_URI} [L,R=301] # 前端控制器路由规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?_route_=$1 [L,QSA]
验证注意事项
修改后需要清空浏览器缓存(301是永久重定向,会被浏览器长期缓存),再测试非www域名的访问情况即可。
内容的提问来源于stack exchange,提问作者user7862339
相关产品推荐
相关产品推荐

