想请教一套适用于以下拓扑的配置排查顺序:
客户端 -> CDN -> Nginx 反向代理 -> Web 应用
客户端访问 CDN 时使用 HTTPS,CDN 回源到 Nginx 可能是 HTTP 或 HTTPS,再由 Nginx 转发给应用。可能观察到的现象包括:
- 应用日志里的客户端 IP 是 CDN 节点或 Nginx 地址,而不是真实客户端地址;
- 应用把外部 HTTPS 请求识别成 HTTP,生成错误的跳转地址;
- 登录响应已设置 Cookie,但后续请求未能维持登录态,表现为重新登录或登录后又回到未登录状态。
目前考虑按下面顺序排查:
- 先在 CDN、Nginx 和应用入口分别确认请求头,检查 CDN 是覆盖还是追加
X-Forwarded-For,以及是否传递准确的X-Forwarded-Proto。 - 再配置 Nginx 的可信来源范围,只信任 CDN 官方出口网段;核对
real_ip_header、set_real_ip_from、real_ip_recursive,并确认转发给应用的X-Forwarded-For没有被重复追加或直接信任客户端伪造值。 - 然后配置应用或框架的
trusted proxy,限定只接受来自 Nginx/CDN 的代理头,并确认代理层数或可信 IP 范围与实际拓扑一致。 - 在应用能够稳定识别原始协议为 HTTPS 后,再检查会话 Cookie 的
Secure、SameSite、Domain和Path。其中跨站登录或回调若需要SameSite=None,应同时满足Secure,否则先判断是否可使用Lax。
这个顺序是否合理?尤其想确认两点:如果 CDN 到 Nginx 使用 HTTP,Nginx 是否应保留 CDN 提供的原始 X-Forwarded-Proto,而不是用 $scheme 覆盖;以及真实 IP 恢复后,传给应用的 X-Forwarded-For 应如何避免重复链路和信任范围过宽。希望能给出一套逐层验证的方法或常见配置陷阱。