htaccess“命令”拒绝,允许,拒绝

时间:2012-03-30 12:35:12

标签: apache .htaccess

我想只允许一个国家/地区访问,但在此国家/地区内排除代理。

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

<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>

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

6 个答案:

答案 0 :(得分:121)

更新:为新的apache 2.4直接跳到最后。

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

  • 首要重点是,Order关键字会对AllowDeny指令的使用方式产生重大影响。
  • 其次,DenyAllow指令不按其编写顺序应用,它们必须被视为两个不同的块(一个用于Deny指令,一个用于{{ 1}})。
  • 第三,它们完全不像防火墙规则:所有规则都适用,第一场比赛的过程没有停止

您有两种主要模式:

订单拒绝允许模式,或允许任何人 - 除了此列表或可能不是

Allow
  • 这是默认允许模式。您可以选择指定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 规则。
  • 首先,某人的请求必须至少匹配一个Allow规则。
  • 如果某人与Allow匹配,您仍然可以使用Allow拒绝他们。

以简化形式:

Deny

回到你的案例

您需要允许国家/地区网络的网络列表。在这个国家/地区,您希望排除某些代理的IP地址。

您已采用 allow-anyone-except-this-list-or-maybe-not 模式,因此默认任何人都可以访问您的服务器,但代理服务器除外Rule Allow list of Allow rules Except list of Deny rules Policy Deny (when no rule fired) 列表中列出的IP,但如果被拒绝,则仍允许国家/地区网络。这太宽泛了。不好。

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

Deny from all通常会与Deny from all一起删除允许默认访问,并生成简单易读的配置。例如,在此之后指定允许的IP列表。您不需要该规则,您的问题是三向访问模式的完美案例(默认策略,例外,异常例外)。

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

所有这些都不推荐使用Apache 2.4

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

因此旧的奇怪order deny,allow逻辑成为遗物,并引用新文档:

  

过去控制授权的执行方式和顺序一直是个谜。

答案 1 :(得分:3)

只需使用order allow,deny,然后移除deny from all行。

答案 2 :(得分: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..规则轻松覆盖。

答案 3 :(得分:2)

不直接回答OP问题,但是对于发现此问题的人来说,要清楚allow,denydeny,allow之间的差异:

将逗号读作&#34;但是&#34;。

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

仅允许一个国家/地区访问,但不包括此国家/地区内的代理

OP需要具有例外情况的白名单,因此allow,deny代替deny,allow

答案 4 :(得分:1)

正如Gerben建议的那样,只需改变:

order deny,allow
deny from all

order allow,deny

这些限制将按照您的要求运作。

详情可在Apache's docs找到。

答案 5 :(得分:0)

在apache2中,Linux配置

  

要求所有已授予

相关问题