为什么 REMOTE_ADDR 有时仅可用作 Apache 环境变量?

Xio*_*iov 5 apache-2.2

为了避免X-Forwarded-For在 Varnish中进行解析,我试图只在 SSL 终止符(当前是 Apache)上设置一个标头,它将直接客户端 IP 存储在标头中。

在我们的开发机器上,这有效:

RequestHeader set X-Foo %{REMOTE_ADDR}e
Run Code Online (Sandbox Code Playgroud)

然而,在分阶段它没有。具体来说,标题是空的,如两者所示varnishlog

13 TxHeader     b X-Foo: (null)
Run Code Online (Sandbox Code Playgroud)

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

同样,日志REMOTE_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>
Run Code Online (Sandbox Code Playgroud)

由于开发机器是一个开发机器,它在很多方面都不同;但是,我无法追踪导致这种情况的差异。Apache 的版本是相同的 (2.2.22),我在任何标准配置文件或/etc/sysconfig/httpd. 系统的其余部分相当相似,因为它们是基于相同的 CentOS 5 基础映像构建的。

我什至无法从 Apache 文档中判断是否REMOTE_ADDR应该作为环境变量存在,但它显然可以在一台机器上运行,无论是侥幸还是设计,而且不一致让我发疯。

Mar*_*ner 4

查看源代码,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 之前被调用开发盒上,但不在暂存盒上。(您可能还有其他处理程序。)

用不太技术性的话来说,从您引用的文档中它也说了同样的事情:

除了在 Apache 配置中设置并从 shell 传递的所有环境变量之外,CGI 脚本和 SSI 页面(重点是我的)还提供了一组环境变量,其中包含 CGI 规范所要求的有关请求的元信息。