Apache模块 mod_authz_host

说明 提供基于主机名、IP地址、请求特征的访问控制
状态 基本(B)
模块名 authz_host_module
源文件 mod_authz_host.c
兼容性 仅在 Apache 2.1 及以后的版本中可用

概述

mod_authz_host提供的指令用在<Directory>, <Files>, <Location>段中,也用于.htaccess文件中控制对服务器特定部分的访问。只要能在环境变量中捕获到主机名、IP地址或其他的客户端请求特征,就可以基于这些特征对访问进行控制。AllowDeny指令用于指出允许哪些客户及不允许哪些客户访问服务器,而Order指令设置默认的访问状态并配置AllowDeny指令怎样相互作用。

基于主机的访问控制和基于口令的身份验证两套机制可以同时实现。在这种情况下,Satisfy指令用来决定两套机制如何相互作用。

一般来说,访问控制指令适用于所有的访问方法(GET, PUT, POST等)。在多数情况下这是一个被期望的特性。但是,只限制某些方法而对其他方法不加限制也是可能的:通过把指令放到一个<Limit>段中即可。

Allow 指令

说明 控制哪些主机能够访问服务器的该区域
语法 Allow from all&#124;host&#124;env=env-variable [host&#124;env=env-variable] ...
作用域 directory, .htaccess
覆盖项 Limit
状态 基本(B)
模块 mod_authz_host

Allow指令控制哪些主机可以访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。

这个指令的第一个参数总是"from",随后的参数可以有三种不同形式:如果指定"Allow from all",则允许所有主机访问,按照下述DenyOrder指令的配置。若要只允许特定的主机或主机群访问服务器,host可以用下面任何一种格式来指定:

一个(部分)域名

示例:

        Allow from apache.org

        Allow from .net example.edu

主机名与给定字符串匹配或者以给定字符串结尾的主机允许访问。只有完整的名字组成部分才被匹配,因此上述例子将匹配foo.apache.org但不能匹配fooapache.org 。这样的配置将导致Apache不管HostnameLookups指令是如何设置的,对一个对客户IP地址都要执行两次DNS查询:一次正查询保证IP没有伪造,一次反查询保证主机名没有伪造。只有两次查询的结果都吻合,并且主机名能够被匹配,访问才被允许。

完整的IP地址

示例:

        Allow from 10.1.2.3

        Allow from 192.168.1.104 192.168.1.205

允许拥有这些IP地址的主机进行访问。

部分IP地址

示例:

        Allow from 10.1

        Allow from 10 172.20 192.168.2

IP地址的开始1到3个字节,用于子网限制。

网络/掩码对

示例:

        Allow from 10.1.0.0/255.255.0.0

一个网络"a.b.c.d"和一个掩码"w.x.y.z",用于更精确的子网限制。

网络/nnn无类别域间路由规格(CIDR specification)

示例:

        Allow from 10.1.0.0/16

同前一种情况相似,除了掩码由nnn个高位字节构成。

注意以上例子中的后三个匹配完全相同的一组主机。

IPv6地址和IPv6子网可以像下面这样指定:

       Allow from 2001:db8::a00:20ff:fea7:ccea

       Allow from 2001:db8::a00:20ff:fea7:ccea/10

Allow指令的第三种参数格式允许对服务器的访问由环境变量的一个扩展指定。指定"Allow from env=env-variable"时,如果环境变量env-variable存在则访问被允许。使用由mod_setenvif提供的指令,服务器用一种基于客户端请求的弹性方式提供了设置环境变量的能力。因此,这条指令可以用于允许基于像User-Agent(浏览器类型)、Referer或其他HTTP请求头字段的访问。

示例:

      SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in

      <Directory /docroot>

 Order Deny,Allow

        Deny from all

        Allow from env=let_me_in 
      </Directory>

这种情况下,发送以KnockKnock/2.0开头的用户代理标示的浏览器将被允许访问,而所有其他浏览器将被禁止访问。

Deny 指令

说明 控制哪些主机被禁止访问服务器
语法 Deny from all&#124;host&#124;env=env-variable [host&#124;env=env-variable] ...
作用域 directory, .htaccess
覆盖项 Limit
状态 基本(B)
模块 mod_authz_host

这条指令允许基于主机名、IP地址或者环境变量限制对服务器的访问。Deny指令的参数设置和Allow指令完全相同。

Order 指令

说明 控制默认的访问状态与AllowDeny指令生效的顺序
语法 Order ordering
默认值 Order Deny,Allow
作用域 directory, .htaccess
覆盖项 Limit
状态 基本(B)
模块 mod_authz_host

Order指令控制默认的访问状态与AllowDeny指令生效的顺序。Ordering取值范围是以下几种范例之一:

Deny,Allow

Deny指令在Allow指令之前被评估。默认允许所有访问。任何不匹配Deny指令或者匹配Allow指令的客户都被允许访问。

Allow,Deny

Allow指令在Deny指令之前被评估。默认拒绝所有访问。任何不匹配Allow指令或者匹配Deny指令的客户都将被禁止访问。

Mutual-failure

只有出现在Allow列表并且不出现在Deny列表中的主机才被允许访问。这种顺序与"Order Allow,Deny"具有同样效果,不赞成使用。

关键字只能用逗号分隔;它们之间不能有空格。注意在所有情况下每个AllowDeny指令语句都将被评估。

在下面的例子中,apache.org域中所有主机都允许访问,而其他任何主机的访问都将被拒绝。

      Order Deny,Allow

      Deny from all

      Allow from apache.org

下面例子中,apache.org域中所有主机,除了foo.apache.org子域包含的主机被拒绝以外,其他都允许访问。而所有不在apache.org域中的主机都不允许访问,因为默认状态是拒绝对服务器的访问。

      Order Allow,Deny

      Allow from apache.org

      Deny from foo.apache.org

另一方面,如果上个例子中的Order指令改变为"Deny,Allow",将允许所有主机的访问。这是因为,不管配置文件中指令的实际顺序如何,"Allow from apache.org"指令会最后被评估到并覆盖之前的"Deny from foo.apache.org"。所有不在apache.org域中的主机也允许访问是因为默认状态被改变到了允许

即使没有伴随AllowDeny指令,一个Order指令的存在也会影响到服务器上某一个部分的访问,这是由于它对默认访问状态的影响。例如:

      <Directory /www>

 Order Allow,Deny 
      </Directory>

这样将会禁止所有对/www目录的访问,因为默认状态将被设置为拒绝

Order指令只在服务器配置的每个段内部控制访问指令的处理。这暗示着,例如,一个在<Location>段中出现的AllowDeny指令总是将会在一个<Directory>段或者.htaccess文件中出现的AllowDeny指令之后被评估,而不管Order指令如何设置。要了解配置段落合并的详细信息,参见配置段文档。