Apache HTTP Server 版本 2.4
访问控制可以通过几个不同的模块来完成。其中最重要的模块是 mod_authz_core
和 mod_authz_host
。本文档还讨论了使用 mod_rewrite
进行访问控制。
如果您希望根据访问者的主机地址限制对网站部分内容的访问,最简单的方法是使用 mod_authz_host
。
The Require
提供了多种不同的方式来允许或拒绝访问资源。结合 RequireAll
、RequireAny
和 RequireNone
指令,这些要求可以以任意复杂的方式组合在一起,以执行您的访问策略。
The Allow
、Deny
和 Order
指令由 mod_access_compat
提供,已弃用,将在未来版本中移除。您应该避免使用它们,并避免使用推荐使用它们的过时教程。
这些指令的用法是
Require host address Require ip ip.address
在第一种形式中,address 是一个完全限定的域名(或部分域名);如果需要,您可以提供多个地址或域名。
在第二种形式中,ip.address 是一个 IP 地址、一个部分 IP 地址、一个网络/网络掩码对或一个网络/nnn CIDR 规范。可以使用 IPv4 或 IPv6 地址。
有关此语法示例的更多信息,请参阅 mod_authz_host 文档。
您可以插入 not
来否定特定要求。请注意,由于 not
是对值的否定,因此它不能单独用于允许或拒绝请求,因为 not true 不构成 false。因此,要使用否定来拒绝访问,该块必须包含一个评估为真或假的元素。例如,如果您有人在您的留言板中发送垃圾邮件,并且您想阻止他们,您可以执行以下操作
<RequireAll> Require all granted Require not ip 10.252.46.165 </RequireAll>
来自该地址 (10.252.46.165
) 的访问者将无法看到此指令涵盖的内容。如果您使用的是机器名而不是 IP 地址,则可以使用该机器名。
Require not host host.example.com
而且,如果您想阻止来自整个域的访问,您可以只指定地址或域名的一部分
Require not ip 192.168.205 Require not host phishers.example.com moreidiots.example Require not host gov
可以使用 RequireAll
、RequireAny
和 RequireNone
指令来执行更复杂的规则集。
使用 <If>
,您可以根据任意环境变量或请求头值来允许或拒绝访问。例如,要根据用户代理(浏览器类型)拒绝访问,您可以执行以下操作
<If "%{HTTP_USER_AGENT} == 'BadBot'"> Require all denied </If>
使用 Require
expr
语法,也可以这样写
Require expr %{HTTP_USER_AGENT} != 'BadBot'
通过 User-Agent
进行访问控制是一种不可靠的技术,因为 User-Agent
标头可以根据最终用户的意愿设置为任何内容。
有关可用的表达式语法和变量的更多讨论,请参阅 表达式文档。
The [F]
RewriteRule
标志会导致发送 403 Forbidden 响应。使用它,您可以根据任意条件拒绝访问资源。
例如,如果您想阻止在晚上 8 点到早上 7 点之间访问资源,可以使用 mod_rewrite
。
RewriteEngine On RewriteCond "%{TIME_HOUR}" ">=20" [OR] RewriteCond "%{TIME_HOUR}" "<07" RewriteRule "^/fridge" "-" [F]
这将对晚上 8 点之后或早上 7 点之前的任何请求返回 403 Forbidden 响应。此技术可用于您希望检查的任何条件。您也可以重定向或以其他方式重写这些请求,如果这种方法更可取。
The <If>
指令是在 2.4 中添加的,它取代了 mod_rewrite
传统上用于执行的许多操作,因此您应该在求助于 mod_rewrite 之前先查看它。
The 表达式引擎 为您提供了强大的功能,可以根据任意服务器变量执行各种操作,您应该查阅该文档以获取更多详细信息。
此外,您应该阅读 mod_authz_core
文档,以了解如何组合多个访问要求以及指定它们之间的交互方式。
另请参阅 身份验证和授权 操作指南。