当 RemoteIPHeader X-Forwarded-For 存在时,Apache 不会记录 remoteIP

DaW*_*444 4 httpd.conf virtualhost apache-2.4

我正在使用 Apache/2.4.27

在 VirtualHost 中,我使用以下命令从 Loadbalancer 转发远程客户端 IP 标头:

RemoteIPHeader X-Forwarded-For
Run Code Online (Sandbox Code Playgroud)

该 Virtualhost 服务的应用程序需要它。

这是主 httpd.conf 上下文中的日志格式。

LogFormat "%h (%{X-Forwarded-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Run Code Online (Sandbox Code Playgroud)

当我在虚拟主机中列出 RemoteIPHeader X-Forwarded-For 时,Apache 停止将远程客户端 IP 写入日志。

当我从 VirtualHost 中删除它时,远程客户端 IP 开始再次出现在日志中。

任何想法为什么RemoteIPHeader X-Forwarded-For(%{X-Forwarded-For}i)从 LogFormat玩?

谢谢 !

don*_*999 5

代理层(Nginx)

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Real-IP       $remote_addr;
Run Code Online (Sandbox Code Playgroud)

后端层 (Apache)

# Log format config
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
CustomLog "logs/access_log" common env=forwarded

# Header config
RemoteIPHeader X-Real-IP
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 192.168.10.10 192.168.10.11
Run Code Online (Sandbox Code Playgroud)

描述:

proxy_set_header - 指令设置 nginx 发送到后端的标头;所以在这个例子中我们发送了两个变量(到头):X-Forwarded-ForX-Real-IP

X-Forwarded-For - 在代理端,必须设置此标头应传递到后端并可从其层访问

X-Real-IP - 它不会影响网页上所需的变量,但我们保持启用状态,以便 Apache 服务器将客户端的地址放在日志中(您还需要自己设置日志格式):

### X-Real-IP enabled
172.217.20.206 - - [03/Jun/2017:11:12:11 +0200] "GET /tls-check.php?9832 HTTP/1.0" 200 1409
### X-Real-IP disabled
172.16.21.11 - - [03/Jun/2017:15:12:49 +0200] "GET /tls-check.php?13266 HTTP/1.0" 200 1448
Run Code Online (Sandbox Code Playgroud)

卷曲

:~$ curl -H Cache-Control: no-cache -ks https://example.com/tls-check.php?${RANDOM} | grep "HTTP_X_FORWARDED_FOR\|HTTP_X_REAL_IP\|SERVER_ADDR\|REMOTE_ADDR"
[HTTP_X_FORWARDED_FOR] => 172.217.20.206
[HTTP_X_REAL_IP] => 172.217.20.206
[SERVER_ADDR] => 192.168.10.100
[REMOTE_ADDR] => 192.168.10.10
Run Code Online (Sandbox Code Playgroud)

tls_check.php

<?php

echo '<pre>';
print_r($_SERVER);
echo '</pre>';
exit;

?>
Run Code Online (Sandbox Code Playgroud)


DaW*_*444 5

如果您要使用 mod_remoteip,请将 %a 恢复为该格式。

在 bugzilla 中,mod_remoteip 填充 %a,同时从 %{X-Forwarded-For}i 中删除。因此,在具有一个受信任代理的简单情况下,%a 将保存用于在 X-Forwarded-For 中看到的值,因为 mod_remoteip