为了避免X-Forwarded-For
在 Varnish 中进行解析,我试图在 SSL 终结器(当前为 Apache)上设置一个标头,将直接客户端 IP 存储在标头中。
在我们的开发机器上,这有效:
RequestHeader set X-Foo %{REMOTE_ADDR}e
然而,在分期它没有。具体来说,标题是空的,如下所示varnishlog
:
13 TxHeader b X-Foo: (null)
(在开发机器上,这显示了预期的 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>
由于开发机器是开发机器,它在很多方面都不同;但是,我无法找出导致这种情况的差异。Apache 的版本是相同的(2.2.22),我在任何标准配置文件或/etc/sysconfig/httpd
. 并且系统的其余部分相当相似,因为它们是建立在相同的 CentOS 5 基础映像之上的。
我什至无法从 Apache 文档中判断是否REMOTE_ADDR
应该作为环境变量存在,但它显然可以在一台机器上运行,无论是侥幸还是设计,并且不一致让我发疯。
查看源代码,
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 之前被调用开发箱,但不在临时箱上。(您可能有其他处理程序。)用不太技术的话来说,从你引用的文档中它说的是同样的事情:
如果您使用 mod_ssl 使用 's' 来获取变量的值(在 apache 2.4 上工作)。这是将 X-Forwarded-For 标头设置为 REMOTE_ADDR 的示例。
有关 mod_headers 的更多信息。