不得不说我有点问题,网站一个Apache+Varnish不够,还要在Apache和Varnish之间插入个第三者——Nginx。
因为某些需要,也给该服务器上的个别网站上了CDN。
Apache做后端,前面多一个Nginx Proxy Cache+Varnish,获取用户的真实IP不难,只需给Apache上一个rpaf模块就行了,然后让Varnish处理XFF的内容就好了:
1 2 3 4 5 6 7 8 |
if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } |
无CDN的情况下访问网站,可以正确获取到用户的真实IP。
最近给网站上多了一个CDN,rpaf模块就显得无能为力了。因此,这几天一直苦恼如何让我的网站获取用户真实IP。
问了下那家CDN的客服,给了我这个回答:
当使用CDN后,网站服务器访问日志中的IP地址都将记录为CDN服务器的官方IP。您可以通过下列方式获取访问用户的原始IP:
ASP
Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
PHP
$_SERVER[“HTTP_X_FORWARDED_FOR”]
JSP
request.getHeader(“HTTP_X_FORWARDED_FOR”)
似乎是要我修改我的网站的代码吧,不过这指标不治本,况且Ioncube加密后的,修改是没什么可能的了,问他们能否修改Nginx配置文件实现,不理我了……
看来还是得靠自己。他们既然能把那些代码发来,就证明他们的cdn服务器把真实IP存放在了HTTP_X_FORWARD_FOR里面,那么让nginx处理一下CDN服务器发来的xff的内容就行了了。
首先,取消Varnish处理XFF,把CDN传输的XFF直接交给Nginx处理,也就是注释掉以下内容:
1 2 3 4 5 6 7 8 |
# if (req.restarts == 0) { # if (req.http.x-forwarded-for) { # set req.http.X-Forwarded-For = # req.http.X-Forwarded-For + ", " + client.ip; # } else { # set req.http.X-Forwarded-For = client.ip; # } # } |
然后在nginx的对应域名的setver层的location /层加进一行代码:
1 |
proxy_set_header X-Forwarded-For $http_x_forwarded_for; |
重启Nginx,打开探针看了看,终于正常了……
Comments are closed.