0

我们正在使用这种配置来授予对我们其中一个站点的访问权限

    <LocationMatch "/*">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/8
        SetEnvIf X-Forwarded-For "(,| |^)192\.168\." WhiteIP
        SetEnvIf X-Forwarded-For "(,| |^)172\.(1[6-9]|2\d|3[0-1])\." WhiteIP
        SetEnvIf X-Forwarded-For "(,| |^)10\." WhiteIP
        Allow from env=WhiteIP
    </LocationMatch>

事实上,在这个 Apache 服务器前面还有另一个反向代理,所以所有客户端都会有标头。

问题是有时客户端有其他代理在他们身边,并且X-Forwarded-For标题将被复制或连接。我们使用正则表达式技巧正确处理连接(,| |^),但问题是 Apache 似乎SetEnvIf只针对第一次出现的 Header 运行。

文档不清楚这种行为。关于如何处理这种情况的任何想法?(注意:我们无法控制我们的反向代理的工作方式,只有 Apache)这可能是一个错误吗?我找不到向谷歌询问这个问题的正确方法,也没有找到任何结果。我也尝试过深入研究 mod_setenvif 的代码,但这超出了我的范围。

精度:CentOS 6、Apache 2.2.15 最新补丁版本

4

1 回答 1

1

如果SetEnvIf在第一个参数中看到类似正则表达式的字符,它将进入一种模式,在该模式中迭代所有与正则表达式匹配的标头,直到匹配。

您可以通过指定^X-Forwarded-For$which 将迭代此 1 标头的多次出现来使用它。

这是有多少模块处理多次出现的长期行为的解决方法。这应该更好地记录为特定于模块的解决方案。

于 2019-10-25T18:38:11.647 回答