我似乎无法让真实的客户端 IP 显示在 PHP 的 $_SERVER['REMOTE_ADDR'] 中。它显示在 $_SERVER['X_FORWARDED_FOR'] 中,但 $_SERVER['REMOTE_ADDR'] 始终指向 Varnish 服务 IP。
我尝试了几乎所有能找到的 Varnish vcl 建议。我安装了 Apache 模块 mod_rpaf。但我仍然无法让 $_SERVER['REMOTE_ADDR'] 反映客户端的真实 IP...
我的问题是,这可能吗? 每个使用 Varnish 的人是否都必须对所有 PHP 应用程序执行类似的操作?:
$_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'];
或者我只是没有正确配置它?
答案1
mod_extract_forwarded 是支持最广泛、最稳定、最易用的模块。包含在所有主要发行版中。
答案2
如上所述,使用 mod_extract_forwarded。
如果重新加载 apache 配置时出现以下错误:
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_proxy 模块前mod_extract_forwarded。在 CentOS 6.4 上运行良好。
答案3
你应该看看mod_rpaf可以配置为“修复”这个问题
当满足两个条件时,它会更改其他 Apache 模块可见的客户端远程地址......
答案4
关于错误“未定义符号:proxy_hook_scheme_handler 操作‘configtest’失败。”
我遇到了同样的问题,并访问了这个网页,但网上没有提到解决方案。可能的解决方案在包的“INSTALL”中!
如果您要添加 mod_extract_forwarded 的 Apache 实例未加载 mod_proxy 和 proxy_http,则在加载 mod_extract_forwarded 时会出错。在这种情况下,请编辑 mod_extract_forwarded.c 并注释掉 USING_proxy_http_module 的 #define 或将其更改为 #undef。如果您随后使用 proxy_http 运行 Apache,请不要忘记恢复 #define;否则,proxy_http 插入的任何 X-Fowarded-For 标头都将错误地使用伪造的 IP 号码。
因此基本上:要么启用“mod_proxy 和 proxy_http”,要么注释掉 c 文件中的“USING_proxy_http_module”定义并重建。后者对我有用,我显然在早期的服务器设置上应用了第一个解决方案(但我忘了它)。
[编辑:] 使用 apt-get install libapache2-mod-proxy-html 安装“mod_proxy”