【问题标题】:Using two environment variables to block access in Apache .htaccess在 Apache .htaccess 中使用两个环境变量来阻止访问
【发布时间】:2019-05-04 02:38:39
【问题描述】:

我正在使用 SetEnvIf 和 Deny 在我的 .htaccess 中阻止访问某些国家/地区。

但我需要从该阻止中排除某些 URL,因此我正在为这些 URL 设置另一个环境变量。

如何根据变量 1 和变量 2 的组合进行拒绝?

SetEnvIf GEOIP_COUNTRY_CODE xx BlockedCountry
SetEnvIf Request_URI "^/important" NeverBlock

在伪代码中我现在想这样做:

Deny from env=BlockedCountry && !NeverBlock

【问题讨论】:

    标签: apache .htaccess environment-variables mod-access


    【解决方案1】:

    来自Apache documentation

    语法:拒绝所有|host|env=[!]env-variable [host|env=[!]env 变量] ...

    这意味着您可以一个接一个地组合条件(两者之间没有“布尔”运算符)。

    所以在你的情况下,它应该是这样的

    Deny from env=BlockedCountry env=!NeverBlock
    

    更新

    从您所说的来看,这似乎暗示了 OR 条件而不是 AND (您想要的)。为此,您可以使用此解决方法

    SetEnvIf GEOIP_COUNTRY_CODE xx MustBeBlocked
    SetEnvIf Request_URI "^/important" !MustBeBlocked
    
    Deny from env=MustBeBlocked
    

    使用这种技术,您可以根据具体情况设置/取消设置环境变量,模拟AND 条件。

    【讨论】:

    • 感谢您的参考,但这两个条件之间似乎存在隐含的 OR。现在,当国家/地区不好或 URL 不属于“从不阻止”类别时,访问将被拒绝。这太多了。我需要一个 AND 条件。
    • 这在这个简短的示例中有效,但是否有保证 Apache 按照它们出现在配置中的顺序处理指令?我真的更喜欢使用 2 个变量。
    • 我的猜测是每一行都是按顺序计算的。也许您可以在 Apache 文档中找到答案。另一种解决方案是使用mod_rewrite(连同mod_geoip),在这种情况下,每个条件都按出现的顺序进行评估。
    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2016-09-19
    • 1970-01-01
    • 2012-06-09
    • 2020-10-25
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多