开启 Cloudflare DNS 代理后提示重定向次数过多

IsayIsee Lv3

原因分析

1
浏览器 → Cloudflare(443 HTTPS)→ Nginx → Target

开启 DNS 代理后,Cloudflare SSL 默认使用 灵活 模式:

  • 浏览器 ↔ Cloudflare:HTTPS
  • Cloudflare ↔ 服务器:HTTP(明文)

此时 Nginx 如果配置了强制 HTTPS 跳转,流程变成:

1
2
3
4
5
浏览器请求 https://
Cloudflare 用 HTTP 请求 Nginx
Nginx 看到 HTTP → 301 跳转到 HTTPS
Cloudflare 再用 HTTP 请求 Nginx
Nginx 再 301 → 无限循环 💥

解决方法

将 Cloudflare SSL 模式改为 完全(Full)

Cloudflare 控制台 → 域名 → 概述 → SSL/TLS → 将模式从 灵活 改为 完全完全(严格)

模式 含义
Flexible CF → 源站用 HTTP,会导致循环
Full CF → 源站用 HTTPS(证书可自签)
Full (Strict) CF → 源站用 HTTPS(需有效证书)

改成 完全 后:Cloudflare 会用 HTTPS 访问 Nginx,不再触发重定向循环。


方法二:在 Nginx 中识别 Cloudflare 请求头,跳过强制跳转

Cloudflare 转发请求时会带 X-Forwarded-Proto 头:

1
2
3
4
# 在 server 块中
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}

改成只在非 Cloudflare 代理的情况下跳转,或者去掉 HTTP → HTTPS 的强制重定向,让 Cloudflare 那一层来处理 HTTPS。


方法三:Nginx 监听端口改为只接受 HTTP(让 CF 处理 HTTPS)

如果你不需要源站 HTTPS,可以让 Nginx 只监听 80,去掉强制跳转,由 Cloudflare 负责对外的 HTTPS:

1
2
3
4
5
6
7
server {
listen 80;
# 不写 return 301 强制跳转
location / {
proxy_pass http://127.0.0.1:8080; # Target 端口
}
}

注意

开启 DNS + 完全 模式后:

CF 会用 HTTPS 回源到 Nginx
但 ACME 验证走的是 HTTP 80 端口
CF 默认会把 80 端口的请求也代理,并且可能强制跳转到 HTTPS

会导致 ACME 验证失败(HTTP-01 模式),无法自动续期证书

方法一:

Cloudflare 控制台 → SSL/TLS → Origin Server → Create Certificate → 下载证书配置到 Nginx 即可。

方法二:

使用 DNS-01 模式的 ACME 验证,不受 HTTP/HTTPS 影响。

  • 标题: 开启 Cloudflare DNS 代理后提示重定向次数过多
  • 作者: IsayIsee
  • 创建于 : 2026-04-09 09:38:52
  • 更新于 : 2026-05-18 14:00:26
  • 链接: https://blog.120528.xyz/2026/04/09/fab5f098/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论