NGINX – 当网站可以直接或通过多个redirect到达时,获得真正的IP

我有以下服务器configuration:

Django App – Gunicorn – Nginx

Nginx将传入的请求导向gunicorn实例。 该网站可以直接到达,也可以通过其他域名redirect。 澄清:

应用程序托pipe在api.myapp.com上

  • 有些客户直接向api.myapp.com发出请求
  • 有些客户向someotherdomain.com发出请求,这也是我控制的。 在someotherdomain.comnginxconfiguration中,我使用proxy_pass将请求转发给api.myapp.com

在这个设置中,我希望能够获得最终用户的IP地址。 我有以下指令nginx conf api.myapp.com

set_real_ip_from my_ip; real_ip_header X-Forwarded-For; real_ip_recursive on; 

通过这些指令,当请求来自redirect时,X-Real-IP头被正确设置,但当请求直接进入api.myapp.com时根本没有设置X-Real-IP头,我在这里有点困惑。 我尝试了几个其他的configuration没有成功。 我能做些什么才能获得用户的真正的IPredirect的情况下,并指示accients?

当客户端请求直接到达api.myapp.com ,HTTP标头由发出请求的实际客户端设置。 除非客户端已经被configuration成设置X-Forwarded-For HTTP头部,否则不会有这样的头部。

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

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

这个远程IP地址然后在日志文件中使用,传递给应用程序等。

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