这是我的vclconfiguration文件部分相关的IP转发:
sub vcl_recv { remove req.http.X-Forwarded-For; set req.http.X-Forwarded-For = client.ip; .... (other configuration) } sub vcl_pipe { set req.http.connection = "close"; if (req.http.X-Forwarded-For) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For; } else { set req.http.X-Forwarded-For = regsub(client.ip, ":.*", ""); } } sub vcl_pass { set req.http.connection = "close"; if (req.http.X-Forwarded-For) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For; } else { set req.http.X-Forwarded-For = regsub(client.ip, ":.*", ""); } }
而且我已经在httpd.conf中安装了mod_rpaf和相关的configuration设置:
RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 10.0.0.1 67.23.31.16 RPAFheader X-Forwarded-For
现在,我尝试在我的PHP内使用$_SERVER["HTTP_X_FORWARDED_FOR"]来获取IP地址。 它第一次工作,然后我开始变得空白。 再次,如果我在一段时间后尝试,一分钟之后,我再次得到第一次。
所以,基本上它不是一致的工作,或者是随机的,或者是精确的,只工作一次,而不是一次又一次地工作。 很奇怪。 我有一种感觉,一些东西没有正确configuration。 我花了相当多的时间Googlesearch。 到处都有人推荐添加x-forward-for和安装mod_rpaf模块。 如你所见,我已经完成了。
任何帮助将不胜感激。
如果您仅在vcl_recv子例程中使用它,则您的代码将设置X-Forwarded-For标头。 请参阅此清漆stream程图 ,了解不同子例程如何处理请求。
您已将“RPAFsethostname”设置为“开”。 据我所知,这是使用X主机头而不是主机头。 请检查您的清漆设置是否需要。 通常X主机头不会被使用/设置。
无论如何,使用mod_rpaf的想法是用X-Forwarded-For的值replaceApache的REMOTE_ADDR值。 所以你不必改变你的脚本,基于IP的authentication或日志logging。 对于你的PHP脚本,我build议使用$ _SERVER ['REMOTE_ADDR']。
如果这不能解决您的问题,请closuresmod_rpaf模块。 除了使用$ _SERVER ['REMOTE_ADDR']的脚本之外,基于IP的身份validation或logging其他一切应该可以正常工作。 如果问题没有发生,你的Varnish / Apache设置中的其他内容就不能组合在一起。