06月12, 2018

在有Nginx反向代理的服务器上获取用户真实IP

我的服务器是Nginx+Apache,PHP是在Apache下面跑的,我现在有PHP程序想要得到用户的真实IP地址。我使用$_SERVER['REMOTE_ADDR']来获取用户IP,但由于Nginx反向代理的存在,我获得的IP都是服务器的IP地址。

为了让跑在Nginx下的后端服务器能获取到用户的真实IP,我们可以通过将Nginx侧获得的REMOTE_ADDR加入至反代时发向后端服务器的http包头,再在后端服务器读取来实现得到用户真实ip的效果。

我们可以将该http包头字段名命名为X-Real-IP,在nginx配置文件中,加上proxy_set_header X-Real-IP $remote_addr;,这样header中就会携带IP信息。Apache下的PHP就可以使用$_SERVER['HTTP_X_REAL_IP']获得header中这个字段的值,也就是Nginx侧读取到的用户的真实IP了。

另外,常见的非标准http包头字段里有有个字段叫X-Forwarded-For,Nginx为了方便用户使用,帮我们构造了变量$proxy_add_x_forwarded_for表示这个字段的值。我们可以通过在Nginx中设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;,使得我们在多层Nginx转发的情况下,每经过一次转发,就会加上转发时的IP,用逗号隔开。

PS: WXC帮我指出错误和改博客,太强了!

本文链接:https://debug.fanzheng.org/post/get-user-real-ip-in-nginx-behind-nginx-reverse-proxy.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。