apache模块 mod_authz_host
说明 | 提供基于主机名、IP地址、请求特征的访问控制 |
---|---|
状态 | 基本(B) |
模块名 | authz_host_module |
源文件 | mod_authz_host.c |
兼容性 | 仅在 Apache 2.1 及以后的版本中可用 |
概述
mod_authz_host
提供的指令用在<Directory>
, <Files>
, <Location>
段中,也用于.htAccess
文件中控制对服务器特定部分的访问。只要能在环境变量中捕获到主机名、IP地址或其他的客户端请求特征,就可以基于这些特征对访问进行控制。Allow
和Deny
指令用于指出允许哪些客户及不允许哪些客户访问服务器,而Order
指令设置默认的访问状态并配置Allow
和Deny
指令怎样相互作用。
基于主机的访问控制和基于口令的身份验证两套机制可以同时实现。在这种情况下,Satisfy
指令用来决定两套机制如何相互作用。
一般来说,访问控制指令适用于所有的访问方法(GET
, PUT
, POST
等)。在多数情况下这是一个被期望的特性。但是,只限制某些方法而对其他方法不加限制也是可能的:通过把指令放到一个<Limit>
段中即可。
Allow 指令
说明 | 控制哪些主机能够访问服务器的该区域 |
---|---|
语法 | Allow from all|host|env=env-variable [host|env=env-variable] ... |
作用域 | directory, .htaccess |
覆盖项 | Limit |
状态 | 基本(B) |
模块 | mod_authz_host |
Allow
指令控制哪些主机可以访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。
这个指令的第一个参数总是"from
",随后的参数可以有三种不同形式:如果指定"Allow from all
",则允许所有主机访问,按照下述Deny
和Order
指令的配置。若要只允许特定的主机或主机群访问服务器,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.2IP地址的开始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|host|env=env-variable [host|env=env-variable] ... |
作用域 | directory, .htaccess |
覆盖项 | Limit |
状态 | 基本(B) |
模块 | mod_authz_host |
这条指令允许基于主机名、IP地址或者环境变量限制对服务器的访问。Deny
指令的参数设置和Allow
指令完全相同。
Order 指令
说明 | 控制默认的访问状态与Allow 和Deny 指令生效的顺序 |
---|---|
语法 | Order ordering |
默认值 | Order Deny,Allow |
作用域 | directory, .htaccess |
覆盖项 | Limit |
状态 | 基本(B) |
模块 | mod_authz_host |
Order
指令控制默认的访问状态与Allow
和Deny
指令生效的顺序。Ordering取值范围是以下几种范例之一:
Deny,Allow
-
Deny
指令在Allow
指令之前被评估。默认允许所有访问。任何不匹配Deny
指令或者匹配Allow
指令的客户都被允许访问。 Allow,Deny
-
Allow
指令在Deny
指令之前被评估。默认拒绝所有访问。任何不匹配Allow
指令或者匹配Deny
指令的客户都将被禁止访问。 Mutual-failure
- 只有出现在
Allow
列表并且不出现在Deny
列表中的主机才被允许访问。这种顺序与"Order Allow,Deny
"具有同样效果,不赞成使用。
关键字只能用逗号分隔;它们之间不能有空格。注意在所有情况下每个Allow
和Deny
指令语句都将被评估。
在下面的例子中,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
域中的主机也允许访问是因为默认状态被改变到了允许。
即使没有伴随Allow
和Deny
指令,一个Order
指令的存在也会影响到服务器上某一个部分的访问,这是由于它对默认访问状态的影响。例如:
<Directory /www>
Order Allow,Deny
</Directory>
这样将会禁止所有对/www
目录的访问,因为默认状态将被设置为拒绝。
Order
指令只在服务器配置的每个段内部控制访问指令的处理。这暗示着,例如,一个在<Location>
段中出现的Allow
或Deny
指令总是将会在一个<Directory>
段或者.htaccess
文件中出现的Allow
或Deny
指令之后被评估,而不管Order
指令如何设置。要了解配置段落合并的详细信息,参见配置段文档。