为什么REMOTE_ADDR有时只能作为Apache环境variables使用?

为了避免必须parsingX-Forwarded-For in Varnish,我试图在SSL终结器(当前为Apache)上设置一个标头,用于存储直接客户端IP。

在我们的开发机器上,这个工作:

 RequestHeader set X-Foo %{REMOTE_ADDR}e 

然而,在舞台上它不。 具体而言,标题为空,如varnishlog

 13 TxHeader b X-Foo: (null) 

(在开发机器上,这显示了预期的IP地址。)

同样,loggingREMOTE_ADDR显示它似乎只在开发机器上填充:

 # Config LogFormat "%{X-Forwarded-For}i %{REMOTE_ADDR}e" combined CustomLog "/var/log/httpd/access_log" combined # Log file, staging <my ip> - # Log file, development <my ip> <my ip> 

由于开发机器是开发机器,因此在很多方面都有所不同; 但是,我无法find哪个区别造成这种情况。 Apache的版本是相同的(2.2.22),并且在任何标准configuration文件或/etc/sysconfig/httpd都没有看到任何相关的东西。 而系统的其余部分是相当相似的,因为它们是由相同的CentOS 5基础镜像构build而成的。

我甚至无法从Apache文档中知道REMOTE_ADDR是否存在或不存在作为一个环境variables ,但无论是通过侥幸还是devise,它显然在一台机器上工作,这种不一致使我发疯。

通过查看源代码, REMOTE_ADDR只为服务器本身附带的处理程序设置:mod_proxy_scgi,mod_ext_filter,mod_include,mod_isapi,mod_cgid和mod_cgi(只有它们调用ap_add_common_vars ),所以某些处理程序在mod_headers或mod_log_config之前被调用在你的开发盒上,但不在分期框上。 (你可能有其他的处理程序。)

在较less的技术说话,从你参考文件说,同样的事情:

除了在Apacheconfiguration中设置的所有环境variables以及从shell传递的CGI脚本和SSI页面 (强调我的)都提供了一组包含CGI规范要求的关于请求的元信息的环境variables。

如果你使用mod_ssl使用's'来获取variables的值(在apache 2.4上工作)。 这是将X-Forwarded-For头部设置为REMOTE_ADDR的示例。

 RequestHeader setifempty x-forwarded-for %{REMOTE_ADDR}s 

更多关于mod_headers的信息。