![NGINX-当网站可直接访问或通过多次重定向访问时获取真实 IP](https://linux22.com/image/713157/NGINX-%E5%BD%93%E7%BD%91%E7%AB%99%E5%8F%AF%E7%9B%B4%E6%8E%A5%E8%AE%BF%E9%97%AE%E6%88%96%E9%80%9A%E8%BF%87%E5%A4%9A%E6%AC%A1%E9%87%8D%E5%AE%9A%E5%90%91%E8%AE%BF%E9%97%AE%E6%97%B6%E8%8E%B7%E5%8F%96%E7%9C%9F%E5%AE%9E%20IP.png)
我有以下服务器配置:
Django 应用程序 - Gunicorn - Nginx
Nginx 将传入请求定向到 gunicorn 实例。可以直接访问该站点,也可以通过来自其他域的重定向访问。澄清一下:
应用程序托管于api.myapp.com
- 有些客户直接向api.myapp.com
- 有些客户发出请求someotherdomain.com,也是由我控制的。在 nginx 配置中someotherdomain.com,我将请求转发给api.myapp.com使用 proxy_pass
在此设置中,我希望能够获取最终用户的 IP 地址。我有以下指令 nginx confapi.myapp.com
set_real_ip_from my_ip;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
使用这些指令,当请求来自重定向时,X-Real-IP 标头会正确设置,但当请求直接到达时,则根本不会设置api.myapp.com,我有点困惑。我尝试了其他几种配置,但都没有成功。在重定向和直接访问的情况下,我该怎么做才能获取用户的真实 IP?
答案1
当客户端请求直接到达时,api.myapp.com
HTTP 标头由发出请求的实际客户端设置。除非客户端已配置为设置X-Forwarded-For
HTTP 标头,否则不会有这样的标头。
现在,nginx 特性的目的set_real_ip
是让 nginx 认为请求实际上来自标头中指定的 IP 地址,而不是来自 TCP 套接字的 IP 地址。
因此,总体效果是 nginx 内部远程 IP 变量始终具有实际的客户端 IP 地址。X-Forwarded-For
如果存在并且源 IP 与允许列表匹配,则 IP 地址是 HTTP 标头的内容。否则,它是 TCP 套接字的远程 IP 地址。
然后,该远程 IP 地址将用于日志文件、传递给应用程序等。
因此,要解决您的问题,您需要修复您的代码以使用 nginx 提供的远程 IP 地址。