我在服务器上运行了一些虚拟主机,其中一些是通过 CDN 并且已X-Forward-For
添加到 headersr,有时它只是通过RemoteIPHeader
添加的负载均衡器。
我有 3 个自定义日志配置:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" lb
在我的虚拟主机配置中,我使用 lb、组合或代理作为日志格式。
当我添加RemoteIPHeader X-Forwarded-For
设置客户端 IP 而不是负载均衡器 IP 时,lb 日志正常工作,但代理日志使用 LB IP。当我删除时,RemoteIPHeader X-Forwarded-For
代理日志具有客户端 IP,但 lb 日志具有负载均衡器 IP。这很有意义,因为我需要X-Forwarded-For
根据 CDN 是否已设置它来有条件地设置。
我曾尝试这样做:
<IfModule mod_headers>
RequestHeader set X-Forward-For RemoteIPHeader expr="req('X-Forward-For')==''"
</IfModule>
从这个问题但是它什么也没做。如果这样做,<IfModule mod_headers.c>
就会产生语法问题,如果我把上面的代码放到我设置日志的位置,它会说RequestHeader set X-Forward-For RemoteIPHeader expr="req('X-Forward-For')==''"
有一个意外的 $end。
如何X-Forward-For
根据是否从 CDN 设置来正确设置?