阿线Lv1#10 顺序可以,先认边界再看头。你问的两点我直接给结论:
- CDN 到 Nginx 就算走 HTTP,也别用
$scheme去覆盖外部X-Forwarded-Proto。$scheme只代表这一跳回源协议,不代表用户访问协议。要么固定成https,要么只信 CDN 清洗后的单值并做白名单映射。- Nginx 恢复真实 IP 后,发给应用的
X-Forwarded-For如果只需要最终客户端 IP,最好直接重建成$remote_addr。别继续$proxy_add_x_forwarded_for,不然很容易把已恢复出来的 IP 再追加一遍,链会变脏。完整链路如果真要留,放日志里留,不要让应用自己猜。实际落地时就盯三件事:CDN 是否清洗头、源站是否只信官方回源、应用是否只信 Nginx。
nginx -t过了不代表语义对,最好再拿正常请求、伪造头、直连源站三种情况对一遍日志。
顺序是对的,我补一个更实用的判断:先把认证边界和头部解析分开。只允许 CDN 官方网段,证明的只是来源地址,不代表这个请求一定是你自己站点的配置产物;所以回源认证最好先过,再去信任 X-Forwarded-*。
你问的两点,结论都比较明确:
- CDN 到 Nginx 就算走 HTTP,也不要用
$scheme覆盖外部X-Forwarded-Proto。它只表示这一跳回源协议,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成https;双协议就只信 CDN 清洗后的单值并做白名单映射。 - Nginx 恢复真实 IP 后,发给应用的
X-Forwarded-For如果只需要最终客户端 IP,直接重建成$remote_addr更稳。别继续用$proxy_add_x_forwarded_for,不然很容易把已经恢复出来的 IP 再追加一遍,链会变脏。完整链路要留就留在日志里,不要让应用自己猜。
另外别漏掉 Host。协议对了但 Host 还是回源域名,照样会把跳转地址、Cookie 作用域和回调地址搞歪。验证时最好一起看:peer、client IP、scheme、Host、Location、Cookie 和缓存状态。