Apache 模块 mod_access_compat

Description: 基于主机(名称或 IP 地址)的组授权
Status: Extension
Module Identifier: access_compat_module
Source File: mod_access_compat.c
Compatibility: 在 Apache HTTP Server 2.3 中作为与 Apache httpd 2.x 以前版本的兼容性模块提供。新的 authz 重构已弃用此模块提供的指令。请参阅mod_authz_host

Summary

mod_access_compat提供的指令在<Directory><Files><Location>部分以及.htaccess文件中使用,以控制对服务器特定部分的访问。可以根据 Client 端主机名,IP 地址或 Client 端请求的其他 Feature 来控制访问,如environment variables所示。 AllowDeny伪指令用于指定允许或不允许哪些 Client 端访问服务器,而Order伪指令设置默认访问状态,并配置AllowDeny伪指令如何交互。

基于主机的访问限制和基于密码的身份验证都可以同时实现。在这种情况下,Satisfy指令用于确定两组限制如何相互作用。

Note

mod_access_compat提供的指令已被mod_authz_host弃用。从技术上讲,可以将OrderAllowDeny之类的旧指令与Require之类的新指令混合使用,但不建议这样做。创建此模块是为了支持仅包含旧指令的配置,以促进 2.4 升级。请查看upgrading指南以了解更多信息。

通常,访问限制指令适用于所有访问方法(GETPUTPOST等)。在大多数情况下,这是所需的行为。但是,可以通过将指令括在<Limit>节中来限制某些方法,而使其他方法不受限制。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Allow Directive

Description: 控制哪些主机可以访问服务器区域
Syntax: Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context: directory, .htaccess
Override: Limit
Status: Extension
Module: mod_access_compat

Allow指令影响哪些主机可以访问服务器的区域。可以通过主机名,IP 地址,IP 地址范围或环境变量中捕获的 Client 端请求的其他 Feature 来控制访问。

该指令的第一个参数始终为from。后续参数可以采用三种不同的形式。如果指定了Allow from all,则允许所有主机访问,但要遵循DenyOrder伪指令的配置,如下所述。要仅允许特定主机或主机组访问服务器,可以以下列任何一种格式指定* host *:

Allow from example.org
Allow from .net example.edu

名称匹配或以该字符串结尾的主机被允许访问。仅匹配完整的组件,因此上面的示例将匹配foo.example.org但不匹配fooexample.org。无论HostnameLookups指令的设置如何,此配置都将导致 Apache httpd 对 Client 端 IP 地址执行双重 DNS 查找。它将对 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指令的参数的第三种格式允许基于environment variable的存在来控制对服务器的访问。指定Allow from env=env-variable时,如果环境变量 env-variable 存在,则允许访问请求。指定Allow from env=!env-variable时,如果环境变量 env-variable 不存在,则允许访问请求。服务器可以使用mod_setenvif提供的指令,根据 Client 端请求的 Feature 灵活地设置环境变量。因此,该指令可用于允许基于 Client 端User-Agent(浏览器类型),Referer或其他 HTTP 请求 Headers 字段等因素进行访问。

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开头的浏览器将被允许访问,所有其他浏览器将被拒绝。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Deny Directive

Description: 控制拒绝访问服务器的主机
Syntax: Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context: directory, .htaccess
Override: Limit
Status: Extension
Module: mod_access_compat

该指令允许根据主机名,IP 地址或环境变量来限制对服务器的访问。 Deny指令的参数与Allow指令的参数相同。

Order Directive

Description: 控制默认访问状态和评估AllowDeny的 Sequences。
Syntax: Order ordering
Default: Order Deny,Allow
Context: directory, .htaccess
Override: Limit
Status: Extension
Module: mod_access_compat

Order指令与AllowDeny指令一起控制三遍访问控制系统。第一遍处理Order指令指定的所有Allow或所有Deny指令。第二遍解析其余指令(DenyAllow)。第三遍适用于所有与前两个都不匹配的请求。

请注意,与仅使用第一个匹配项的典型防火墙不同,已处理所有AllowDeny指令。最后一个匹配有效(也不同于典型的防火墙)。此外,行在配置文件中出现的 Sequences 并不重要-所有Allow行都被视为一组,所有Deny行被视为另一组,并且默认状态由其自身考虑。

Order是以下之一:

关键字只能用逗号分隔;不允许在它们之间使用空格。

Match Allow,Deny result Deny,Allow result
仅匹配允许 Request allowed Request allowed
仅匹配拒绝 Request denied Request denied
No match 默认为第二个指令:拒绝 默认为第二个指令:允许
匹配允许和拒绝 决赛控制:拒绝 决赛控制:允许

在以下示例中,允许 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,则将允许所有主机访问。发生这种情况的原因是,无论配置文件中指令的实际 Sequences 如何,Allow from example.org都会被最后求值并覆盖Deny from foo.example.org。所有不在example.org域中的主机也将被允许访问,因为默认状态为Allow

Order指令的存在可能会影响对服务器一部分的访问,即使没有随附的AllowDeny指令也是如此,因为它会影响默认访问状态。例如,

<Directory "/www">
    Order Allow,Deny
</Directory>

将拒绝对/www目录的所有访问,因为默认访问状态设置为Deny

Order指令仅在服务器配置处理的每个阶段内控制访问指令的处理 Sequences。例如,这意味着,在<Location>节中出现的AllowDeny指令将始终在在<Directory>节或.htaccess文件中出现的AllowDeny指令之后进行求值,而与Order指令的设置无关。有关合并配置部分的详细信息,请参见目录,位置和文件部分的工作方式上的文档。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

Satisfy Directive

Description: 主机级访问控制和用户身份验证之间的交互
Syntax: Satisfy Any|All
Default: Satisfy All
Context: directory, .htaccess
Override: AuthConfig
Status: Extension
Module: mod_access_compat
Compatibility: 受 2.0.51 及更高版本中的<Limit><LimitExcept>影响

如果同时使用了AllowRequire,则访问策略。参数可以是AllAny。仅当用户名/密码和 Client 端主机地址都限制了对特定区域的访问时,此指令才有用。在这种情况下,默认行为(All)是要求 Client 端通过地址访问限制*,并且*Importing 有效的用户名和密码。使用Any选项,如果 Client 端通过主机限制或 Importing 有效的用户名和密码,将被授予访问权限。这可用于密码限制区域,但允许来自特定地址的 Client 端进入而无需提示 Importing 密码。

例如,如果您想让网络中的人无限制地访问网站的一部分,但要求网络外的人提供密码,则可以使用类似于以下的配置:

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 以来,<Limit><LimitExcept>部分可以将Satisfy指令限制为特定的方法。

Merging of configuration sections

在新的配置节中使用此模块提供的任何指令时,此模块提供的指令均不会从以前的配置节中继承。

See also

首页