NGINX-当网站可直接访问或通过多次重定向访问时获取真实 IP

NGINX-当网站可直接访问或通过多次重定向访问时获取真实 IP

我有以下服务器配置:

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.comHTTP 标头由发出请求的实际客户端设置。除非客户端已配置为设置X-Forwarded-ForHTTP 标头,否则不会有这样的标头。

现在,nginx 特性的目的set_real_ip是让 nginx 认为请求实际上来自标头中指定的 IP 地址,而不是来自 TCP 套接字的 IP 地址。

因此,总体效果是 nginx 内部远程 IP 变量始终具有实际的客户端 IP 地址。X-Forwarded-For如果存在并且源 IP 与允许列表匹配,则 IP 地址是 HTTP 标头的内容。否则,它是 TCP 套接字的远程 IP 地址。

然后,该远程 IP 地址将用于日志文件、传递给应用程序等。

因此,要解决您的问题,您需要修复您的代码以使用 nginx 提供的远程 IP 地址。

相关内容