Apache / Varnish / PHP:只需确认一下,是否可以自动更新$ _SERVER 来获取真实客户端的IP?

我似乎无法得到真正的客户端IP显示在PHP的$ _SERVER ['REMOTE_ADDR']。 它显示在$ _SERVER ['X_FORWARDED_FOR']中,但是$ _SERVER ['REMOTE_ADDR']总是指向Varnish服务IP。

我已经玩了几乎每一个Varnish VCLbuild议,我可以find。 我已经安装了Apache模块mod_rpaf。 但我仍然无法获得$ _SERVER ['REMOTE_ADDR']来反映客户端的真实IP …

所以我的问题是, 这甚至有可能吗? 每个使用Varnish的人都必须为所有的PHP应用程序做这样的事情吗?

$_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR']; 

或者我只是没有正确configuration?

mod_extract_forwarded是最受支持的,稳定和可用的模块。 包含在所有主要的发行版中。

http://www.openinfo.co.uk/apache/

你应该看看mod_rpaf ,它可以被configuration为为你“修复”这个

当满足两个条件时,它将更改客户端的远程地址(对其他Apache模块可见)。

如前所述,使用mod_extract_forwarded。

如果在重新加载apacheconfiguration时出现以下错误:

 Syntax error on line 1 of /etc/httpd/conf.d/mod_extract_forwarded.conf: Cannot load /etc/httpd/modules/mod_extract_forwarded.so into server: /etc/httpd/modules/mod_extract_forwarded.so: undefined symbol: proxy_hook_scheme_handler 

只需 mod_extract_forward 之前加载mod_proxy模块。 在CentOS 6.4上运行良好。

我个人使用php.ini中的auto_prepend_file指令

只需创build一个PHP脚本,如下所示:

 <?php $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR']; 

然后编辑你的php.ini在任何其他脚本之前执行脚本。

关于错误“未定义的符号:proxy_hook_scheme_handler行动'configtest'失败。”

我遇到了同样的问题,并在这个网页,但没有提到在networking上的解决scheme。 可能的解决scheme是在包装的“INSTALL”里面!

如果您正在添加mod_extract_forwarded的Apache实例将不会加载mod_proxy和proxy_http,那么当加载mod_extract_forwarded时将会出现错误。 在这种情况下,编辑mod_extract_forwarded.c并将#define注释掉为USING_proxy_http_module或将其更改为#undef。 如果您随后使用proxy_http运行Apache,请不要忘记恢复#define; 如果不这样做,则意味着由proxy_http插入的任何X-Fowarded-For标头将错误地使用伪造的IP编号。

所以基本上:要么启用'mod_proxy和proxy_http'或注释掉'cs文件中的'USING_proxy_http_module'定义和重build。 后者为我工作,我显然应用了早期的服务器设置的第一个解决scheme(我忘记了)。

[编辑:]用apt-get安装'mod_proxy'安装libapache2-mod-proxy-html