我不太懂 ngxin 的配置,半斤八两,网上搜了一些资料,似乎还是有些迷糊
我的环境是这样的:
我用的 Python, 然后外面套了一个 nginx, 然后接入了阿里云的 cdn
流量是先到 阿里云 cdn, 再到我的 nginx, 最后到我的 Python web 服务
用了阿里云的 cdn 后, 无法简单快速的 到真实的 ip,
搜索后发现 在 nginx 里添加 一段配置代码,似乎勉强可以
proxy_set_header Host $host;
proxy_set_header Ali-CDN-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
但是我加了这个代码后, 在客户端的 headers 里,ali-cdn-real-ip 获取的并不是客户端的真实 ip,而是阿里云 cdn 的 ip (每次刷新会变)
只有 headers 里的 x-forwarded-for 获取的第一个 ip 是客户端真实 ip (没有重新拨号的情况下,刷新也不会改变)
我想问问,阿里云为什么要搞一个 Ali-CDN-Real-IP, 为什么无法用 x-real-ip 获取到真实 ip 呢
阿里云是自己搞了一套标准吗? 它为什么不遵守行业标准, 让 x-real-ip 获取的就是客户端的真实 ip 呢?
我该怎么让 获取真实 ip 这个流程更具有鲁棒性呢?(比如我下次可能换腾讯云的 cdn,或者其他 cdn,是否有一个标准,可以让我更换 cdn 厂家后,我不用改配置文件,也可以获取到 真实的客户端 ip )
谢谢
1
find456789 OP 搞定了, 删除配置里的
``` proxy_set_header Ali-CDN-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` header 里默认就有 Ali-CDN-Real-IP , 用 Ali-CDN-Real-IP 就可以获取到真实 ip --- 真不知道,为什么阿里云要搞这么复杂, 而且文档也不好找, 我祝福阿里云能倒闭 |
2
pupboss 2021-08-19 01:48:26 +08:00 via iPhone
从头到尾没觉得阿里云有什么问题。上了 CDN 本来你就拿不到 IP,因为客户没直接访问你
proxy_add_x_forwarded_for 是可以拿到途经 IPs,但是也可以伪造 CDN 直接接触客户出口 IP,阿里云用自定义的头给你返回真实 IP,你说他自己实现一套标准祝他倒闭 那你觉得阿里云是应该覆盖你哪个请求头呢?覆盖了你会不会又说阿里云不遵守行业规则 |
3
pupboss 2021-08-19 01:57:05 +08:00 via iPhone 1
手机回复,忘了一段,x-real-ip 有他自己的作用,他代表的是连接到本机的地址,在你的例子中,他就应该是 CDN 的 IP,这个不可伪造,而且他的定义是在 nginx 上获取连接到你机器的 IP 。阿里云如果覆盖了他才是不合规范
|
4
swulling 2021-08-19 03:13:37 +08:00 via iPhone
这几个都是非标准的 http header 。
其中 forward for 勉强有一个事实标准,所以应该以此为准 |
5
yeqizhang 2021-08-19 08:45:50 +08:00 via Android
阿里云可能真的文档不好找吧。但是你如果搞清楚了$remote_addr 是啥就不会去抄那些错误的配置了
|
6
ch2 2021-08-19 11:46:58 +08:00
用了 CDN 就只能通过他们私有的请求头获取你想要的信息
|