apache https重定向循环本质是规则缺少“守门条件”,导致已满足目标状态(如已是https或目标域名)的请求仍被反复跳转;正确解法是仅对不满足目标状态的请求执行跳转,例如用rewritecond %{https} off [or] rewritecond %{http_host} !^www.example.com$ [nc]组合判断,并确保allowoverride all启用、cdn回源协议一致。

Apache 中 HTTPS 重定向循环,本质是规则没加“守门条件”,导致本该跳过的请求也被反复重定向。核心解法就一条:**只对不满足目标状态的请求执行跳转**。
检查并修正 .htaccess 或虚拟主机中的重定向条件
常见错误写法(无守门):
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
问题:只要走 HTTP(端口 80),不管当前是不是已连 HTTPS 域名,都强制跳——包括跳过去之后的第二次请求,又触发同一条规则,形成循环。
正确做法:增加协议和域名双重判断,确保只跳一次:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
先确认当前不是 HTTPS:
RewriteCond %{HTTPS} off -
或当前主机名不匹配目标格式(比如要统一 www):
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] - 再组合使用,避免多条件冲突。例如统一跳到
https://www.example.com:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
确保 .htaccess 生效且未被覆盖
很多“跳不起来”或“跳错”其实是配置没生效:
- 检查 Apache 主配置中是否开启:
AllowOverride All(不是None或FileInfo) - 确认
AccessFileName是.htaccess,且文件名拼写正确(无空格、大小写一致) - 重启 Apache:
sudo systemctl restart httpd(CentOS/RHEL)或sudo systemctl restart apache2(Debian/Ubuntu)
区分接口与页面请求,避免 POST 被 301 破坏
全局 301 会把 POST 自动转成 GET,导致表单、API 失败。解决方法:
- 排除 API 路径:
RewriteCond %{REQUEST_URI} !^/api/或!/wp-json/ - 对非页面请求改用 307/308:
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=307,L] - 或者前端直接发 HTTPS 请求,后端不依赖跳转
排查 CDN 或反代层干扰
如果用了 Cloudflare、阿里云 ESA、WAF 等,它们可能已做了一层 HTTPS 强制跳转,而源站又配了第二层,就会叠加循环:
- 临时关闭 CDN 的“强制 HTTPS”功能,测试源站是否仍跳转
- 检查回源协议:CDN 回源应设为 HTTPS(端口 443),而非 HTTP + 源站再跳 HTTPS
- 在源站 Apache 中,可信任 CDN 传来的头:
SetEnvIf X-Forwarded-Proto https HTTPS=on,让 PHP/WordPress 等识别真实协议










