【问题标题】:htaccess "order" Deny, Allow, Denyhtaccess "order" 拒绝、允许、拒绝
【发布时间】:2012-04-14 03:25:22
【问题描述】:

我希望只允许一个国家/地区访问,但排除该国家/地区内的代理。

这就是我所拥有的(为方便起见缩短版)

<Limit GET POST>
order deny,allow
deny from all
allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
.
deny from 186.201.27.66
deny from 186.201.196.1
deny from 186.214.51.231
deny from 186.237.225.26
</Limit>

但我知道这行不通。我该怎么做?

【问题讨论】:

  • 当然可以,但在这种情况下,(代理)最后一个拒绝组 IP 在允许的 IP 范围内,这将被最后处理。
  • 改用order allow,deny
  • 喜欢这个? order allow,deny allow from 139.82.0.0/16 allow from 143.54.0.0/16 allow from 186.192.0.0/11 allow from 186.224.0.0/11 . . . deny from 186.201.27.66 deny from 186.201.196.1 deny from 186.214.51.231 deny from 186.237.225.26 deny from all 因为拒绝是最后处理的,deny from all 不会使所有允许无效吗?
  • 我错过了deny from all。您需要完全删除该行。引用 apache 的文档。首先,评估所有 Allow 指令;至少一个必须匹配,否则请求将被拒绝。接下来,评估所有拒绝指令。如果有任何匹配,则拒绝该请求。最后,默认情况下拒绝任何与 Allow 或 Deny 指令不匹配的请求。
  • 谢谢!您能否确认“允许,拒绝”将按预期工作,只要我不对所有人使用拒绝?

标签: apache .htaccess


【解决方案1】:

按照 Gerben 的建议,只需更改:

order deny,allow
deny from all

order allow,deny

这些限制将按照您的意愿发挥作用。

详情请见Apache's docs

【讨论】:

  • allow, deny 中的空格有问题。 order takes one argument, 'allow,deny', 'deny,allow', or 'mutual-failure'
【解决方案2】:

只需改用order allow,deny 并删除deny from all 行。

【讨论】:

  • 对,这个应该有解释!见下文。
  • 不需要解释的答案
【解决方案3】:

把你的代码改成

<Limit GET POST>
deny from all

allow from 139.82.0.0/16
allow from 143.54.0.0/16
allow from 186.192.0.0/11
allow from 186.224.0.0/11
</Limit>

这样,您的 htaccess 将拒绝除您使用 allow from.. 明确允许的之外的所有内容

允许范围内的代理可以很容易地被附加的deny from.. 规则覆盖。

【讨论】:

    【解决方案4】:

    更新:为新的 apache 2.4 直接跳转到末尾。

    Order 关键字及其与DenyAllow 指令的关系是一场真正的噩梦。了解我们如何最终得到这样的解决方案会非常有趣,至少可以说是一种不直观的解决方案。

    • 第一个重点是Order 关键字将对AllowDeny 指令的使用方式产生很大影响。
    • 其次,DenyAllow 指令不按写入顺序应用,它们必须被视为两个不同的块(一个用于 Deny 指令,一个用于 Allow)。
    • 第三,它们与防火墙规则完全不同:应用所有规则,进程在第一次匹配时不会停止

    您有两种主要模式:

    Order-Deny-Allow-mode,或Allow-anyone-except-this-list-or-maybe-not

    Order Deny,Allow
    
    • 这是一种默认允许模式。您可以选择指定Deny 规则。
    • 首先,Deny 规则拒绝某些请求。
    • 如果有人被拒绝,您可以通过Allow 让他们回来。

    我将其改写为:

    Rule Deny
         list of Deny rules
    Except
         list of Allow rules
    Policy Allow (when no rule fired)
    

    Order-Allow-Deny-mode,或 Reject-everyone-except-this-list-or-maybe-not

    Order Allow,Deny
    
    • 这是一种默认拒绝模式。所以你通常指定Allow 规则。
    • 首先,某人的请求必须至少匹配一个Allow 规则。
    • 如果有人匹配 Allow,您仍然可以使用 Deny 拒绝他们。

    简化形式:

    Rule Allow
         list of Allow rules
    Except
         list of Deny rules
    Policy Deny (when no rule fired)
    

    回到你的案例

    您需要允许一个网络列表,这些网络是国家网络。在这个国家,你想排除一些代理的 IP 地址。

    您已采用 allow-anyone-except-this-list-or-maybe-not 模式,因此默认情况下 任何人 都可以访问您的服务器,代理除外Deny 列表中列出的 IP,但如果它们被拒绝,您仍然允许国家网络。那太宽泛了。不好。

    通过反转为order allow,deny,您将处于reject-everyone-except-this-list-or-maybe-not 模式。 因此,您将拒绝所有人访问但允许国家网络,然后您将拒绝代理。当然,您必须删除@Gerben 和@Michael Slade 所述的Deny from all(这个答案只解释了他们写的内容)。

    Deny from all 通常与order deny,allow 一起看到,以删除默认允许 访问并进行简单、可读的配置。例如,在此之后指定允许的 IP 列表。您不需要该规则,您的问题是 3 路访问模式(默认策略、例外、例外的例外)的完美案例。

    但是设计这些设置的人肯定是疯了。

    Apache 2.4 已弃用所有这些

    整个授权方案已在 Apache 2.4 中使用RequireAllRequireAnyRequireNone 指令重构。参见例如this complex logic example

    所以旧的奇怪Order 逻辑成为一个遗物,并引用新的文档:

    过去,控制授权的应用方式和顺序一直是个谜

    【讨论】:

      【解决方案5】:

      不直接回答 OP 的问题,而是让人们找到这个问题以明确allow,denydeny,allow 之间的区别:

      把逗号读成“但是”。

      • allow but deny:有例外的白名单。
        一切都被拒绝,除了允许列表中的项目,除了拒绝列表中的项目
      • deny but allow:有例外的黑名单。
        一切都是允许的,除了拒绝列表中的项目,除了允许列表中的项目

      只允许一个国家/地区访问,但排除该国家/地区内的代理

      OP 需要一个有例外的白名单,因此 allow,deny 而不是 deny,allow

      【讨论】:

        【解决方案6】:

        在apache2中,linux配置

        要求全部授予

        【讨论】:

          猜你喜欢
          • 2014-10-23
          • 2014-09-03
          • 2011-07-02
          • 2017-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          相关资源
          最近更新 更多