.htaccess配置HTTP转HTTPS重定向失效,触发ERR_TOO_MANY_REDIRECTS
解决HTTPS重定向循环(ERR_TOO_MANY_REDIRECTS)问题
看起来你遇到了典型的HTTPS重定向循环问题,结合你的.htaccess配置,我来帮你排查并解决:
问题根源分析
- 重复开启RewriteEngine:你的配置里多次写入
RewriteEngine On,虽然Apache会忽略重复的开启指令,但这会让配置逻辑混乱,也可能引发规则执行顺序的潜在问题。 - HTTPS检测条件不准确:如果你的网站使用了CDN或反向代理服务器,直接用
%{HTTPS} off判断协议会失效——CDN会先处理用户的HTTPS请求,再以HTTP方式转发到你的源服务器,此时%{HTTPS}变量永远是off,导致服务器不断将HTTPS请求重定向到HTTPS,最终触发重定向循环。
修复后的完整.htaccess配置
我已经整理并修正了所有规则,把重定向逻辑放在最优先位置,同时兼容直接访问和CDN/反向代理场景:
RewriteEngine On # HTTP转HTTPS重定向,兼容源服务器直接访问与CDN/反向代理场景 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # 自定义404错误页面 ErrorDocument 404 /error404.php # PHP错误显示(注意:生产环境建议关闭,改为记录到日志文件) php_flag display_errors 1 # 友好URL重写规则 RewriteRule ^/?movie/([0-9A-Za-z\-:]+)/?$ /movie.php?id=$1 [NC,L] RewriteRule ^/?cast/([0-9A-Za-z\-:]+)/?$ /cast.php?cast=$1 [NC,L] RewriteRule ^/?keyword/([0-9A-Za-z\-:]+)/?$ /keyword.php?keyword=$1 [NC,L]
关键修改说明
- 合并RewriteEngine指令:仅在配置开头写一次
RewriteEngine On,确保所有重写规则在同一引擎实例下执行。 - 优化HTTPS检测逻辑:新增
%{HTTP:X-Forwarded-Proto} !https条件,这个HTTP头是CDN/反向代理用来告知源服务器用户实际请求协议的,无论网站是直接对外还是通过CDN,都能正确识别请求协议。 - 调整规则顺序:将HTTPS重定向规则放在最前面,确保用户请求进来后先完成协议转换,再处理友好URL重写。
- 规范正则写法:将规则中的
-转义为\-,避免在正则表达式中被误判为范围符号(当前场景虽不影响,但规范写法更安全)。
验证步骤
- 将修改后的
.htaccess保存到网站根目录。 - 清除浏览器缓存:由于之前的301永久重定向已被浏览器缓存,需清除缓存或使用无痕模式测试。
- 分别用HTTP和HTTPS访问网站,确认:
- HTTP请求会自动跳转到HTTPS
- HTTPS请求无重定向循环提示
内容的提问来源于stack exchange,提问作者sdad
相关产品推荐
相关产品推荐

