HTTPS重定向失效求助:.htaccess配置后无法正常跳转
先帮你拆解下当前的问题:你的.htaccess重定向规则看起来没问题,但实际触发了302循环回原HTTP地址,还附带ErrorDocument的报错,这说明要么规则本身有隐藏的语法/逻辑问题,要么服务器环境里还有其他配置在捣乱。下面是一步步的排查方向,你可以逐个测试:
1. 修正.htaccess规则的语法格式
你当前的规则是把三条指令挤在了同一行:
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Apache的Rewrite规则要求每条指令单独占一行,否则会解析错误。规范的写法应该是:
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- 拆分后Apache能正确识别每条指令
- 加上
[L,R=301]标志:L表示这是最后执行的规则,避免后续规则干扰;R=301是永久重定向(你当前默认是302临时重定向,虽然不是循环的直接原因,但规范写法建议加上) - 给匹配模式加上
^和$,避免不必要的模糊匹配
2. 验证服务器HTTPS变量的可靠性
有些服务器环境(比如用了反向代理、负载均衡,或者部分主机商的配置)中,%{HTTPS}变量可能不会正确返回on/off——因为实际的SSL终止在前端服务器,你的Apache拿到的其实是HTTP请求。这种情况下,得换用%{HTTP:X-Forwarded-Proto}来判断:
修改规则为:
RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
你也可以先做个小测试:在.htaccess里加一行
Header set X-Test-HTTPS "%{HTTPS}e"
然后用curl -v http://www.domain.com.au访问,看响应头里的X-Test-HTTPS值是什么。如果是空或者不是off,说明%{HTTPS}变量不可靠,必须用X-Forwarded-Proto替代。
3. 排查其他.htaccess规则或服务器配置的干扰
- 看看.htaccess文件后面的规则,比如WordPress自带的Permalink规则,会不会覆盖或打断你的重定向?比如WordPress的规则通常在文件后半段,如果你前面的重定向没加
[L]标志,就可能被后续规则干扰。 - 检查服务器的主配置文件(比如
httpd.conf、virtualhost.conf)里有没有其他Rewrite规则、Redirect指令,或者ErrorDocument配置?你看到的提示里有ErrorDocument报错,说明服务器可能配置了自定义错误页面,但这个页面本身也触发了循环。可以临时注释掉.htaccess里的ErrorDocument行(如果有的话),测试是否还会出现这个报错。
4. 确认WordPress的站点URL配置
WordPress本身的站点URL如果还是HTTP的话,会和.htaccess的重定向冲突,导致循环:
- 能登录后台的话,去设置->常规,检查
WordPress地址(URL)和站点地址(URL)是否都是https://www.domain.com.au/ - 要是登不上后台,直接修改
wp-config.php文件,添加这几行强制HTTPS:
define('WP_SITEURL', 'https://www.domain.com.au'); define('WP_HOME', 'https://www.domain.com.au'); define('FORCE_SSL_ADMIN', true);
这样能确保WordPress生成的所有链接都是HTTPS,避免反向重定向回HTTP。
5. 测试极简版重定向规则
先简化规则,排除复杂变量的影响,测试最基础的重定向是否生效:
RewriteEngine On RewriteRule ^ https://www.domain.com.au%{REQUEST_URI} [L,R=301]
用这个规则直接强制所有请求跳转到HTTPS,如果生效了,说明之前的%{HTTPS}或%{HTTP_HOST}变量有问题;如果还是循环,那大概率是服务器环境的问题——比如HTTPS的虚拟主机配置错误,或者SSL证书有问题导致HTTPS请求本身被重定向回HTTP。
6. 检查服务器的HTTPS监听和SSL配置
- 确认你的Apache虚拟主机配置中,443端口的HTTPS配置是正确启用的,并且指向了正确的站点目录。如果HTTPS的VHost配置错误(比如证书无效、目录不对),服务器可能会把HTTPS请求重定向回HTTP。
- 用
curl -v https://www.domain.com.au测试HTTPS站点是否正常响应,如果返回的是302到HTTP,那说明问题出在HTTPS本身的配置上,和.htaccess无关。
内容的提问来源于stack exchange,提问作者php-b-grader

