.htaccess配置HTTP转HTTPS重定向失败:ERR_TOO_MANY_REDIRECTS问题
%{HTTPS}变量返回off的原因及解决办法 核心问题是你的Apache服务器在处理HTTPS请求时,%{HTTPS}变量始终返回off,导致重定向规则无限循环,触发ERR_TOO_MANY_REDIRECTS错误。以下是常见原因和对应的排查/解决方式:
1. 站点部署在反向代理/负载均衡之后
如果你的网站使用了Nginx、Cloudflare这类反向代理,或者负载均衡器,HTTPS连接会在代理层终止,实际传递给Apache的请求都是HTTP协议。这种情况下Apache的%{HTTPS}自然是off,但代理通常会通过X-Forwarded-Proto请求头告知Apache原始请求的协议。
解决办法:修改.htaccess规则,改用X-Forwarded-Proto头判断协议:
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
注意:需要确认代理服务器确实会发送X-Forwarded-Proto头,同时Apache配置中允许传递该请求头(比如在虚拟主机配置里启用mod_headers,并确保没有过滤掉这个头)。
2. Apache虚拟主机配置未启用SSL
当前服务器的HTTPS虚拟主机配置可能缺失关键的SSLEngine On指令,导致Apache无法识别443端口的请求为HTTPS连接。
排查/解决:检查站点的虚拟主机配置文件(路径通常为/etc/httpd/conf.d/或/etc/apache2/sites-available/),确保HTTPS虚拟主机包含以下配置:
<VirtualHost *:443> ServerName www.example.com SSLEngine On SSLCertificateFile /path/to/your/certificate.crt SSLCertificateKeyFile /path/to/your/private.key # 其他站点相关配置 </VirtualHost>
只有当SSLEngine设置为On时,Apache才会将该端口的请求标记为HTTPS,%{HTTPS}变量才会返回on。
3. 额外验证方式
你可以在.htaccess中添加调试规则,确认请求头信息:
RewriteEngine On RewriteRule ^debug$ /debug?https_val=%{HTTPS}&forwarded_proto=%{HTTP:X-Forwarded-Proto} [R=301,L]
访问https://www.example.com/debug,查看重定向后的URL参数,就能直观看到%{HTTPS}和X-Forwarded-Proto的具体值,快速定位问题根源。
内容的提问来源于stack exchange,提问作者CruzDelSur

