![为什么 REMOTE_ADDR 有时才可用作 Apache 环境变量?](https://linux22.com/image/640151/%E4%B8%BA%E4%BB%80%E4%B9%88%20REMOTE_ADDR%20%E6%9C%89%E6%97%B6%E6%89%8D%E5%8F%AF%E7%94%A8%E4%BD%9C%20Apache%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%9F.png)
为了避免在 Varnish 中进行解析X-Forwarded-For
,我尝试在 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
应该存在环境变量,但它显然在一台机器上运行良好,无论是侥幸还是设计,这种不一致性让我抓狂。
答案1
查看源代码,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 规范所要求的。
答案2
如果您使用 mod_ssl,请使用“s”来获取变量的值(适用于 apache 2.4)。这是将 X-Forwarded-For 标头设置为 REMOTE_ADDR 的示例。
RequestHeader setifempty x-forwarded-for %{REMOTE_ADDR}s