Apache访问控制

Apache访问控制

访问控制可以由几个不同的模块完成。其中最重要的模块是mod_authz_coremod_authz_host。本文中还将讨论使用mod_rewrite来实现访问控制。

1. 主机访问控制

如果您希望根据访问者的主机地址限制访问您网站的某些部分,则可以使用mod_authz_host轻松完成此操作。

Require提供了各种允许或拒绝访问资源的不同方法。结合RequireAllRequireAnyRequireNone指令,这些要求可以以任意复杂的方式组合,以强制执行您的访问策略。

这些指令的用法是:

Require host address
Require ip ip.address

在第一种形式中,地址是完全限定的域名(或部分域名); 如果需要,您可以提供多个地址或域名。

在第二种形式中,ip.address是IP地址,部分IP地址,网络/网络掩码对或network/nnn CIDR规范。可以使用IPv4或IPv6地址。

您可以插入而不是否定特定要求。注意,由于not不是值的否定,因此它不能单独用于允许或拒绝请求。因此,要使用否定拒绝访问,块必须具有一个评估为truefalse的元素。例如,如果您有人向您的留言板发送垃圾邮件,并且您希望将其保留,则可以执行以下操作:

<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

可以使用RequireAllRequireAnyRequireNone指令来强制执行更复杂的需求集。

2. 任意变量的访问控制

使用<If>,您可以根据任意环境变量或请求标头值来允许或拒绝访问。例如,要拒绝基于用户代理(浏览器类型)的访问,您可以执行以下操作:

<If "%{HTTP_USER_AGENT} == 'BadBot'">
    Require all denied
</If>

使用Require expr语法,这也可以写成:

Require expr %{HTTP_USER_AGENT} != 'BadBot'

3. 使用mod_rewrite进行访问控制

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响应。此技术可用于您要检查的任何条件。如果首选此方法,还可以重定向或以其他方式重写这些请求。

在Apache 2.4中添加的<If>指令取代了mod_rewrite传统上习惯做的许多事情,但应该先求助于mod_rewrite