ProxyFix 的 x_for 到底该写几?nginx 的 X-Forwarded-For 用覆盖还是追加?直接取 XFF 第一个元素行不行?这篇用一个写了假 X-Forwarded-For 的请求,把五种配置下 Flask 认定的客户端地址逐个对照(防御向,只验证配置的效果)。
[A] nginx 用 $remote_addr 覆盖 XFF,ProxyFix(x_for=1)
服务端收到的 XFF 头 = '127.0.0.1'
request.remote_addr = 127.0.0.1 | access_route = ['127.0.0.1'] | 取第一个元素 = 127.0.0.1
[B] nginx 用 $proxy_add_x_forwarded_for 追加,ProxyFix(x_for=1)
服务端收到的 XFF 头 = '203.0.113.9, 127.0.0.1'
request.remote_addr = 127.0.0.1 | access_route = ['203.0.113.9', '127.0.0.1'] | 取第一个元素 = 203.0.113.9
[C] nginx 追加,但 ProxyFix(x_for=2)(多信任了一层)
服务端收到的 XFF 头 = '203.0.113.9, 127.0.0.1'
request.remote_addr = 203.0.113.9 | access_route = ['203.0.113.9', '127.0.0.1'] | 取第一个元素 = 203.0.113.9
[D] nginx 追加,没有 ProxyFix,取 XFF 第一个元素(常见的写法)
服务端收到的 XFF 头 = '203.0.113.9, 127.0.0.1'
request.remote_addr = 127.0.0.1 | access_route = ['203.0.113.9', '127.0.0.1'] | 取第一个元素 = 203.0.113.9
[E] nginx 覆盖,没有 ProxyFix(只看 remote_addr)
服务端收到的 XFF 头 = '127.0.0.1'
request.remote_addr = 127.0.0.1 | access_route = ['127.0.0.1'] | 取第一个元素 = 127.0.0.1上一篇:HTTPS 与反向代理;下一篇:Flask 同步请求模型。
客户端、nginx、gunicorn 都在本机,真实客户端地址与代理看到的地址都是 127.0.0.1,所以用请求里写的假地址 203.0.113.9 来区分「被信任」与「没被信任」的取值。
直连(没有 nginx),ProxyFix(x_for=1),请求头 XFF = 203.0.113.9 → remote_addr = 203.0.113.9
这一部分是第一个实验的补充:没有 nginx,直接连 gunicorn。