现在单节点普遍的部署方式是由 Nginx 接入,然后静态资源 nginx 负责,动态内容反代到业务节点。这种情况下业务节点为了读取真实访问 IP 通常的做法是推送 X-forward-for 扩展头。
但是在接入 cf 代理后,nginx 收到的 X-forward-for 头内存储的信息是 cf 节点的 IP ,而 cf 节点会将用户 ip 再多存在一个 x-cloudflare-userip←类似的这种头里。nginx 有办法实现将后者推到业务的时候自动将 x-cloudflare-userip 的内容替换到 X-forward-for 里吗?
业务上也可以修改读取头的部位来获取真实 IP ,但是业务很多组件都是按默认大家通用的做法来写的,如果要改业务的话感觉要改的地方有点太多了
|  |      1also24      2022-03-24 20:26:25 +08:00 | 
|      2icy37785      2022-03-24 20:29:22 +08:00 via iPhone 这个不是搜索一下就能给你好几个方案的嘛。比如用 ngx_http_realip_module 模块 | 
|  |      3cweijan      2022-03-24 20:31:55 +08:00 可以的, 我前段时间也遇到了这个问题, 查了下资料, 代理网站会将用户真实 ip 放在请求头 proxy_add_x_forwarded_for, 这是一种通用标准 ```nginx location /{ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ``` | 
|  |      4cweijan      2022-03-24 20:33:26 +08:00 X-Forwarded-For 是由多个代理 ip 组成的, 按逗号分隔, 第一个 ip 就是用户 ip | 
|  |      5silverfox      2022-03-24 22:58:39 +08:00 | 
|  |      6LeeReamond OP | 
|  |      7LeeReamond OP @silverfox 这个方案也可以,看起来是直接替换反代 IP ,但似乎与 cf 服务器绑定了 | 
|  |      8cweijan      2022-03-24 23:47:29 +08:00 @LeeReamond 反正在 Java 界的话, 用 nginx 通过请求头获取 IP 是共识. | 
|      9sixgodf      2022-03-25 00:23:57 +08:00 浏览器 --> 代理上网 (可能)--> DNS 解析 --> CDN 节点(可能) --> WEB 数据处理 --> 数据吐到浏览器渲染展示,X-Forwarded-For :  用户 IP, 代理服务器 1-IP, 代理服务器 2-IP, 代理服务器 3-IP, ….不管客户端请求经过了层层代理和多重 CDN ,都能得到用户“真实 IP” map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.|:|a-f\.|:|A-F\.|:]+),?.*$ $firstAddr; } |