现在单节点普遍的部署方式是由 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 ,但是业务很多组件都是按默认大家通用的做法来写的,如果要改业务的话感觉要改的地方有点太多了
1
also24 2022-03-24 20:26:25 +08:00
|
2
icy37785 2022-03-24 20:29:22 +08:00 via iPhone
这个不是搜索一下就能给你好几个方案的嘛。比如用 ngx_http_realip_module 模块
|
3
cweijan 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; } ``` |
4
cweijan 2022-03-24 20:33:26 +08:00
X-Forwarded-For 是由多个代理 ip 组成的, 按逗号分隔, 第一个 ip 就是用户 ip
|
5
silverfox 2022-03-24 22:58:39 +08:00
|
6
LeeReamond OP |
7
LeeReamond OP @silverfox 这个方案也可以,看起来是直接替换反代 IP ,但似乎与 cf 服务器绑定了
|
8
cweijan 2022-03-24 23:47:29 +08:00
@LeeReamond 反正在 Java 界的话, 用 nginx 通过请求头获取 IP 是共识.
|
9
sixgodf 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; } |