err_too_many_redirects是因cdn回源走http触发宝塔无条件301跳转所致,需改用if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; }并透传x-forwarded-proto头、清理cdn缓存、修正程序数据库中的http硬编码。

宝塔面板开启强制HTTPS后出现ERR_TOO_MANY_REDIRECTS
这是典型的协议判断失效导致的死循环:浏览器发HTTP请求 → 宝塔301跳转到HTTPS → 后端(如Nginx)又因CDN或代理头缺失,误判为HTTP请求 → 再次301跳转……无限套娃。
关键点在于:$_SERVER['HTTPS'] 或 $_SERVER['HTTP_X_FORWARDED_PROTO'] 在PHP中不可靠,而宝塔的「强制HTTPS」功能仅依赖Nginx配置中的return 301 https://$host$request_uri;,不校验上游是否已走HTTPS。
- 如果你用了Cloudflare、腾讯云CDN、阿里云全站加速等,真实用户请求根本没到达你的服务器——CDN回源时默认走HTTP,触发宝塔重定向
- 宝塔v8.0+在「网站设置 → SSL → 强制HTTPS」勾选后,会向Nginx配置插入无条件
return 301,不检查$scheme或$http_x_forwarded_proto - WordPress、Typecho等CMS若在后台设置了
siteurl为http://,即使Nginx跳转成功,页面内资源仍可能加载HTTP链接,触发混合内容阻断(不是重定向,但表现类似白屏)
正确配置Nginx以兼容CDN和直连
不要依赖宝塔界面的「强制HTTPS」开关。手动编辑网站配置文件(/www/server/panel/vhost/nginx/xxx.conf),把自动生成的return 301块替换为带条件判断的写法:
if ($http_x_forwarded_proto != 'https') {
return 301 https://$host$request_uri;
}
这段代码只在未被CDN标记为HTTPS时才跳转。前提是CDN回源时必须透传X-Forwarded-Proto: https头(Cloudflare默认开启;腾讯云CDN需在「访问控制 → 回源配置」中开启「透传X-Forwarded-Proto」;阿里云全站加速需在「回源HTTP头」里添加X-Forwarded-Proto: https)。
- 不要用
$scheme != 'https',因为CDN回源后$scheme永远是http - 如果同时用了多层代理(如Nginx前置+CDN),优先信任
$http_x_forwarded_proto,它由最外层可信代理设置 - 确认宝塔没有在配置末尾重复插入
return 301——保存配置后务必点击「重载配置」,并检查Nginx错误日志(/www/wwwlogs/nginx_error.log)是否有rewrite or internal redirection cycle
清理CDN缓存与验证真实响应头
CDN缓存的是301跳转响应本身。哪怕你改好了Nginx,用户访问的仍是旧的跳转指令,直到缓存过期或手动清除。
- Cloudflare:进入「缓存 → 配置 → 缓存清除」,选择「清除特定URL」,填入
http://yoursite.com/*和https://yoursite.com/* - 腾讯云CDN:「缓存刷新 → URL刷新」,输入根域名,协议无关(它会同时刷新HTTP/HTTPS缓存)
- 用
curl -I http://yoursite.com验证:返回应为HTTP/2 301且Location: https://...;再执行curl -I https://yoursite.com,返回必须是HTTP/2 200,不能是301 - 浏览器访问时按
Ctrl+Shift+I → Network,看第一个请求的Status和Location响应头,确认无嵌套跳转
WordPress等程序的数据库硬编码问题
即使Nginx和CDN都正常,WordPress仍可能从数据库读取http://地址拼接跳转URL。典型表现:首页能打开,但点文章链接又跳回HTTP。
检查wp_options表中siteurl和home两个字段值是否为https://开头。不要用插件批量替换,直接执行SQL:
UPDATE wp_options SET option_value = replace(option_value, 'http://yoursite.com', 'https://yoursite.com') WHERE option_name = 'home' OR option_name = 'siteurl';
- 如果无法进后台,临时在
wp-config.php顶部加两行:define('WP_HOME','https://yoursite.com');和define('WP_SITEURL','https://yoursite.com'); - Typecho用户需修改
config.inc.php里的$config['siteUrl'],并确保后台「设置 → 基本」中站点地址填HTTPS - Discuz! X3.5+需在后台「站长 → 站点信息 → 网站URL」改为HTTPS,并清空
data/cache/目录
重定向循环的根因从来不在单一环节,而是Nginx判断逻辑、CDN头透传、程序数据库三者之间的协议认知错位。漏掉任意一环,都会让修复变成徒劳。











