访问控制可以由几个不同的模块完成。其中最重要的模块是mod_authz_core
和mod_authz_host
。本文中还将讨论使用mod_rewrite
来实现访问控制。
1. 主机访问控制
如果您希望根据访问者的主机地址限制访问您网站的某些部分,则可以使用mod_authz_host
轻松完成此操作。
Require
提供了各种允许或拒绝访问资源的不同方法。结合RequireAll
,RequireAny
和RequireNone
指令,这些要求可以以任意复杂的方式组合,以强制执行您的访问策略。
这些指令的用法是:
Require host address
Require ip ip.address
Shell
在第一种形式中,地址是完全限定的域名(或部分域名); 如果需要,您可以提供多个地址或域名。
在第二种形式中,ip.address
是IP地址,部分IP地址,网络/网络掩码对或network/nnn CIDR规范。可以使用IPv4或IPv6地址。
您可以插入而不是否定特定要求。注意,由于not不是值的否定,因此它不能单独用于允许或拒绝请求。因此,要使用否定拒绝访问,块必须具有一个评估为true
或false
的元素。例如,如果您有人向您的留言板发送垃圾邮件,并且您希望将其保留,则可以执行以下操作:
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
Shell
来自该地址的访客(10.252.46.165)将无法查看该指令涵盖的内容。相反,如果您拥有机器名称而不是IP地址,则可以使用它。
Require not host host.example.com
Shell
而且,如果您想阻止整个域的访问,只能指定地址或域名的一部分:
Require not ip 192.168.205
Require not host phishers.example.com moreidiots.example
Require not host gov
Shell
可以使用RequireAll
,RequireAny
和RequireNone
指令来强制执行更复杂的需求集。
2. 任意变量的访问控制
使用<If>
,您可以根据任意环境变量或请求标头值来允许或拒绝访问。例如,要拒绝基于用户代理(浏览器类型)的访问,您可以执行以下操作:
<If "%{HTTP_USER_AGENT} == 'BadBot'">
Require all denied
</If>
Shell
使用Require expr
语法,这也可以写成:
Require expr %{HTTP_USER_AGENT} != 'BadBot'
Shell
3. 使用mod_rewrite进行访问控制
RewriteRule
标志导致发送403 Forbidden响应。使用此方法,可以根据任意条件拒绝对资源的访问。
例如,如果您希望在晚上8点到早上7点之间阻止对资源的访问,则可以使用mod_rewrite
执行此操作。
RewriteEngine On
RewriteCond "%{TIME_HOUR}" ">=20" [OR]
RewriteCond "%{TIME_HOUR}" "<07"
RewriteRule "^/fridge" "-" [F]
Shell
这将在晚上8点之后或早上7点之前为任何请求返回403 Forbidden响应。此技术可用于您要检查的任何条件。如果首选此方法,还可以重定向或以其他方式重写这些请求。
在Apache 2.4中添加的<If>
指令取代了mod_rewrite
传统上习惯做的许多事情,但应该先求助于mod_rewrite
。