通过.htaccess文件强制HTTP跳转HTTPS失败问题求助
解决.htaccess HTTP转HTTPS规则导致的连接失败问题
你的问题核心是无限重定向循环,这是规则逻辑冲突引发的。我来拆解问题并给出修复方案:
问题根源
- 重复的
RewriteEngine On:虽然Apache会忽略重复指令,但冗余代码可能干扰规则解析(虽非本次主因,但需优化)。 - 非www转www规则使用
http://:启用HTTPS跳转后,请求先被转到HTTPS,但非www转www规则又将其跳回HTTP,再次触发HTTPS跳转,形成无限循环,最终导致浏览器无法连接。 - 规则逻辑分离:分开处理HTTPS和www跳转容易出现逻辑冲突,合并规则可避免这类问题。
修复后的完整.htaccess代码
Options +FollowSymLinks -MultiViews RewriteEngine on RewriteBase / # 合并HTTP转HTTPS + 非www转www的规则,避免循环 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\.MYWEBSITE\.co\.uk$ RewriteRule ^(.*)$ https://www.MYWEBSITE.co.uk/$1 [R=301,L] # 移除末尾斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1? [R=301,L] # 仅当直接请求时移除.php后缀 RewriteCond %{THE_REQUEST} (\.php) RewriteRule ^(.+)\.php /$1 [R=301,L,QSA] # 内部重写回.php文件(用户看不到后缀) RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php # 排除index.php的重写 RewriteRule ^index\.php$ - [L] # 前端控制器规则(路由到index.php) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php
关键修复点说明
- 合并跳转规则:用
[OR]条件同时检查HTTPS状态和域名是否带www,一次性跳转到https://www.MYWEBSITE.co.uk,避免两次跳转带来的循环风险。 - 统一使用HTTPS目标:所有跳转都指向HTTPS地址,确保不会触发重复的HTTPS跳转检查。
- 移除冗余指令:删掉重复的
RewriteEngine On,保持配置简洁。
测试前的注意事项
- 清除浏览器缓存:301永久重定向会被浏览器缓存,之前的错误缓存可能导致测试结果不准确,建议用隐私窗口测试。
- 确认SSL配置正常:你手动输入HTTPS能正常访问,说明证书没问题,但要确保服务器的
mod_ssl模块已启用(这是HTTPS跳转生效的前提)。 - 检查虚拟主机配置:如果服务器虚拟主机中已有重定向规则,可能和.htaccess规则冲突,建议确认无重复跳转逻辑。
内容的提问来源于stack exchange,提问作者Whitena
相关产品推荐
相关产品推荐

