Apache HTTP Server 版本 2.4
描述 | 基于主机(名称或 IP 地址)的组授权 |
---|---|
状态 | 扩展 |
模块标识符 | access_compat_module |
源文件 | mod_access_compat.c |
兼容性 | 在 Apache HTTP Server 2.3 中可用,作为与早期版本的 Apache httpd 2.x 的兼容模块。此模块提供的指令已被新的 authz 重构所弃用。请参阅 mod_authz_host |
由 mod_access_compat
提供的指令用于 <Directory>
、<Files>
和 <Location>
部分以及 .htaccess
文件,以控制对服务器特定部分的访问。可以根据客户端主机名、IP 地址或客户端请求的其他特征(如 环境变量 中捕获的特征)来控制访问。Allow
和 Deny
指令用于指定哪些客户端可以或不可以访问服务器,而 Order
指令设置默认访问状态,并配置 Allow
和 Deny
指令如何相互作用。
基于主机的访问限制和基于密码的身份验证可以同时实现。在这种情况下,Satisfy
指令用于确定这两组限制如何相互作用。
由 mod_access_compat
提供的指令已被 mod_authz_host
弃用。将旧指令(如 Order
、Allow
或 Deny
)与新指令(如 Require
)混合虽然在技术上可行,但建议不要这样做。此模块是为了支持仅包含旧指令的配置而创建的,以方便 2.4 升级。有关更多信息,请查看 升级 指南。
通常,访问限制指令适用于所有访问方法(GET
、PUT
、POST
等)。这在大多数情况下是期望的行为。但是,可以通过将指令包含在 <Limit>
部分中,来限制某些方法,同时保留其他方法不受限制。
当此模块提供的任何指令用于新的配置部分时,不会从以前的配置部分继承此模块提供的任何指令。
描述 | 控制哪些主机可以访问服务器的某个区域 |
---|---|
语法 | Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ... |
上下文 | directory, .htaccess |
覆盖 | Limit |
状态 | 扩展 |
模块 | mod_access_compat |
Allow
指令影响哪些主机可以访问服务器的某个区域。可以通过主机名、IP 地址、IP 地址范围或客户端请求中捕获的其他特征(如环境变量)来控制访问。
此指令的第一个参数始终是 from
。后续参数可以采用三种不同的形式。如果指定了 Allow from all
,则所有主机都允许访问,但受 Deny
和 Order
指令的配置影响,如下所述。要仅允许特定主机或主机组访问服务器,可以以以下任何格式指定 host
Allow from example.org Allow from .net example.edu
名称匹配或以该字符串结尾的主机被允许访问。仅匹配完整组件,因此上面的示例将匹配 foo.example.org
,但不会匹配 fooexample.org
。此配置将导致 Apache httpd 对客户端 IP 地址执行双重 DNS 查找,无论 HostnameLookups
指令的设置如何。它将对 IP 地址执行反向 DNS 查找以查找关联的主机名,然后对主机名执行正向查找以确保它与原始 IP 地址匹配。只有当正向和反向 DNS 一致且主机名匹配时,才会允许访问。
Allow from 10.1.2.3 Allow from 192.168.1.104 192.168.1.205
允许访问的主机的 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。用于更细粒度的子网限制。
Allow from 10.1.0.0/16
与上一情况类似,只是网络掩码由 nnn 个高位 1 位组成。
请注意,上面的最后三个示例匹配完全相同的宿主集。
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 存在,则请求被允许访问。当指定 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 from all|host|env=[!]env-variable [host|env=[!]env-variable] ... |
上下文 | directory, .htaccess |
覆盖 | Limit |
状态 | 扩展 |
模块 | mod_access_compat |
此指令允许根据主机名、IP 地址或环境变量来限制对服务器的访问。Deny
指令的参数与 Allow
指令的参数相同。
描述 | 控制默认访问状态以及 Allow 和 Deny 的评估顺序。 |
---|---|
语法 | Order ordering |
默认 | Order Deny,Allow |
上下文 | directory, .htaccess |
覆盖 | Limit |
状态 | 扩展 |
模块 | mod_access_compat |
Order
指令与 Allow
和 Deny
指令一起控制一个三遍访问控制系统。第一遍处理所有 Allow
或所有 Deny
指令,具体取决于 Order
指令的指定。第二遍解析其余指令(Deny
或 Allow
)。第三遍适用于不匹配前两遍的任何请求。
请注意,所有 Allow
和 Deny
指令都会被处理,这与典型的防火墙不同,典型的防火墙只使用第一个匹配项。最后一个匹配项是有效的(这也与典型的防火墙不同)。此外,配置文件中行的出现顺序并不重要 - 所有 Allow
行都被视为一个组,所有 Deny
行被视为另一个组,默认状态被单独考虑。
Ordering 是以下之一
Allow,Deny
Allow
指令;必须至少匹配一个,否则请求将被拒绝。接下来,评估所有 Deny
指令。如果任何匹配,则请求将被拒绝。最后,任何不匹配 Allow
或 Deny
指令的请求默认情况下会被拒绝。Deny,Allow
Deny
指令;如果任何匹配,则请求将被拒绝,**除非**它也匹配 Allow
指令。任何不匹配任何 Allow
或 Deny
指令的请求都将被允许。Mutual-failure
Order Allow,Deny
的效果相同,并且已被弃用,建议使用 Order Allow,Deny
。关键字只能用逗号分隔;不允许在它们之间使用空格。
匹配 | Allow,Deny 结果 | Deny,Allow 结果 |
---|---|---|
仅匹配 Allow | 请求已允许 | 请求已允许 |
仅匹配 Deny | 请求被拒绝 | 请求被拒绝 |
无匹配 | 默认为第二个指令:拒绝 | 默认为第二个指令:允许 |
匹配 Allow 和 Deny | 最终匹配控制:拒绝 | 最终匹配控制:允许 |
在以下示例中,example.org 域中的所有主机都允许访问;所有其他主机都被拒绝访问。
Order Deny,Allow Deny from all Allow from example.org
在下一个示例中,example.org 域中的所有主机都允许访问,除了 foo.example.org 子域中的主机,它们被拒绝访问。不在 example.org 域中的所有主机都被拒绝访问,因为默认状态是 Deny
对服务器的访问。
Order Allow,Deny Allow from example.org Deny from foo.example.org
另一方面,如果最后一个示例中的 Order
更改为 Deny,Allow
,则所有主机都将被允许访问。这是因为,无论配置文件中指令的实际顺序如何,Allow from example.org
将最后被评估,并将覆盖 Deny from foo.example.org
。不在 example.org
域中的所有主机也将被允许访问,因为默认状态是 Allow
。
存在 Order
指令可能会影响对服务器一部分的访问,即使没有伴随的 Allow
和 Deny
指令,因为它的影响会改变默认的访问状态。例如,
<Directory "/www"> Order Allow,Deny </Directory>
将拒绝对 /www
目录的所有访问,因为默认的访问状态设置为 Deny
。
Order
指令仅控制服务器配置处理每个阶段内访问指令处理的顺序。这意味着,例如,在 <Location>
部分中出现的 Allow
或 Deny
指令将始终在 <Directory>
部分或 .htaccess
文件中出现的 Allow
或 Deny
指令之后进行评估,无论 Order
指令的设置如何。有关配置部分合并的详细信息,请参阅有关 Directory、Location 和 Files 部分的工作原理 的文档。
当此模块提供的任何指令用于新的配置部分时,不会从以前的配置部分继承此模块提供的任何指令。
描述 | 主机级访问控制与用户身份验证之间的交互 |
---|---|
语法 | Satisfy Any|All |
默认 | Satisfy All |
上下文 | directory, .htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_access_compat |
兼容性 | 受 2.0.51 及更高版本中的 <Limit> 和 <LimitExcept> 影响 |
如果同时使用 Allow
和 Require
,则访问策略。参数可以是 All
或 Any
。此指令仅在通过用户名/密码和客户端主机地址限制对特定区域的访问时才有用。在这种情况下,默认行为(All
)是要求客户端通过地址访问限制并输入有效的用户名和密码。使用 Any
选项,如果客户端通过主机限制或输入有效的用户名和密码,则将授予其访问权限。这可以用于对区域进行密码限制,但允许来自特定地址的客户端在不提示输入密码的情况下访问。
例如,如果您想让您网络上的人员无限制地访问您网站的一部分,但要求您网络外部的人员提供密码,您可以使用类似以下配置
Require valid-user Allow from 192.168.1 Satisfy Any
Satisfy
指令的另一个常见用途是放宽对子目录的访问限制
<Directory "/var/www/private"> Require valid-user </Directory> <Directory "/var/www/private/public"> Allow from all Satisfy Any </Directory>
在上面的示例中,将要求对 /var/www/private
目录进行身份验证,但不会要求对 /var/www/private/public
目录进行身份验证。
从 2.0.51 版本开始,Satisfy
指令可以通过 <Limit>
和 <LimitExcept>
部分限制为特定方法。
当此模块提供的任何指令用于新的配置部分时,不会从以前的配置部分继承此模块提供的任何指令。