.htaccess配置异常:访问www域名跳转至404页面问题排查
问题分析与修复方案
首先,你的.htaccess代码存在几个关键逻辑问题,导致访问www.example.com时跳转到404页面,同时也没完全实现你想要的三个功能:
1. 反向的WWW重定向逻辑
你当前的规则是把非HTTPS请求跳转到https://www.%{HTTP_HOST},但你的需求是移除www前缀,这完全搞反了方向!而且规则里的RewriteCond %{HTTP_HOST} !^www$条件,是当主机名恰好是www(而非www.example.com)时才触发,这对实际域名匹配毫无意义,直接导致后续规则逻辑混乱。
2. 缺少移除index.php的规则
你的代码里完全没有实现移除URL末尾index.php的规则,这部分功能处于缺失状态。
3. 孤立的RewriteCond干扰规则匹配
那条RewriteCond %{REQUEST_FILENAME}.php -f没有对应的RewriteRule,它会成为后续所有规则的前置条件,错误地干扰规则匹配逻辑,最终引发不必要的404跳转。
修复后的完整.htaccess代码
Options +FollowSymLinks RewriteEngine On # 1. 强制所有请求使用HTTPS(优先处理,避免多次跳转) RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] # 2. 移除域名的www前缀(在HTTPS强制之后执行) RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 3. 移除URL末尾的index.php RewriteCond %{THE_REQUEST} /index\.php [NC] RewriteRule ^(.*)index\.php$ /$1 [R=301,L] # 可选:内部重写,自动为不存在的请求添加.php后缀(按需保留) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] # 404错误页面配置 ErrorDocument 404 /404.php
关键修复点解释
- HTTPS强制优先:先把所有HTTP请求转到HTTPS,避免后续重定向出现混合内容问题,同时减少跳转次数。
- 正确的www移除规则:用
^www\.(.+)$捕获www后的域名主体,跳转到不带www的HTTPS地址;[NC]确保不区分大小写,[L]表示执行完这条规则后停止后续匹配,避免逻辑冲突。 - 精准移除index.php:通过
%{THE_REQUEST}匹配实际请求行(比如GET /index.php HTTP/1.1),只对显式的index.php请求做重定向,不会影响PHP文件的内部加载。 - 配对RewriteCond与RewriteRule:把孤立的PHP后缀判断条件和对应的重写规则绑定,放在所有重定向规则之后,避免干扰跳转逻辑。
- 简化404配置:直接使用相对路径
/404.php即可,无需写完整域名(除非404页面在其他域名下)。
现在测试访问www.example.com,会自动跳转到https://example.com,三个功能都能正常生效,不会再出现404跳转的问题。
内容的提问来源于stack exchange,提问作者peiman F.
相关产品推荐
相关产品推荐

