Apache/Varnish/PHP:只是为了确认,是否可以自动更新 $_SERVER['REMOTE_ADDR'] 以获取真实客户端的 IP?

Apache/Varnish/PHP:只是为了确认,是否可以自动更新 $_SERVER['REMOTE_ADDR'] 以获取真实客户端的 IP?

我似乎无法让真实的客户端 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 是支持最广泛、最稳定、最易用的模块。包含在所有主要发行版中。

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

答案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”

相关内容