<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 重写

使用 mod_rewrite 控制访问

可用语言:  en  |  fr 

本文档是对 mod_rewrite 参考文档 的补充。它描述了如何使用 mod_rewrite 控制对各种资源的访问以及其他相关技术。这包括许多 mod_rewrite 常用示例,包括对每个示例如何工作的详细描述。

请注意,这些示例中的许多在您的特定服务器配置中无法直接使用,因此您需要理解它们,而不仅仅是将示例复制粘贴到您的配置中。
Support Apache!

另请参阅

top

禁止图像“热链接”

描述

以下技术禁止其他网站在其页面中内联您的图像的做法。这种做法通常被称为“热链接”,会导致您的带宽被用来为其他人的网站提供内容。

解决方案

此技术依赖于HTTP_REFERER变量的值,该变量是可选的。因此,有些人可能会绕过此限制。但是,大多数用户会遇到请求失败,这应该随着时间的推移导致该图像从其他网站中删除。

您可以通过多种方式处理这种情况。

在第一个示例中,如果请求不是从我们网站上的页面发起的,我们只需拒绝该请求。在本例中,我们假设我们的网站是www.example.com

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$"    "-"   [F,NC]

在第二个示例中,我们不是失败请求,而是显示一个替代图像。

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$"    "/images/go-away.png"   [R,NC]

在第三个示例中,我们将请求重定向到其他网站上的图像。

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif"   [R,NC]

在这些技术中,后两种技术往往最有效地阻止人们热链接您的图像,因为他们根本看不到他们期望看到的图像。

讨论

如果您只想拒绝对资源的访问,而不是将该请求重定向到其他地方,则无需使用 mod_rewrite

SetEnvIf Referer "example\.com" localreferer
<FilesMatch "\.(jpg|png|gif)$">
    Require env localreferer
</FilesMatch>
top

阻止机器人

描述

在本食谱中,我们将讨论如何阻止来自特定机器人或用户代理的持久请求。

机器人排除的标准定义了一个文件/robots.txt,该文件指定了您希望排除机器人的网站部分。但是,一些机器人不遵守这些文件。

请注意,有一些方法可以实现这一点,而无需使用 mod_rewrite。还要注意,任何依赖于客户端USER_AGENT字符串的技术都很容易被绕过,因为该字符串可以更改。

解决方案

我们使用一个规则集来指定要保护的目录和识别恶意或持久机器人的客户端USER_AGENT

在本例中,我们阻止名为NameOfBadRobot的机器人访问/secret/files位置。如果您试图仅从特定来源阻止该用户代理,您也可以指定 IP 地址范围。

RewriteCond "%{HTTP_USER_AGENT}"   "^NameOfBadRobot"
RewriteCond "%{REMOTE_ADDR}"       "=123\.45\.67\.[8-9]"
RewriteRule "^/secret/files/"   "-"   [F]
讨论

您无需使用 mod_rewrite 即可实现相同的效果,如以下示例所示

SetEnvIfNoCase User-Agent "^NameOfBadRobot" goaway
<Location "/secret/files">
    <RequireAll>
        Require all granted
        Require not env goaway
    </RequireAll>
</Location>

如上所述,此技术很容易被绕过,只需修改USER_AGENT请求头即可。如果您遇到持续攻击,您应该考虑在更高级别(例如防火墙)阻止它。

top

拒绝拒绝列表中的主机

描述

我们希望维护一个主机列表,类似于hosts.deny,并阻止这些主机访问我们的服务器。

解决方案
RewriteEngine on
RewriteMap    hosts-deny  "txt:/path/to/hosts.deny"
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR]
RewriteCond   "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule   "^"  "-"  [F]

##
## hosts.deny
##
## 注意!这是一个映射,而不是一个列表,即使我们将其视为列表。
## mod_rewrite 解析它以查找键值对,因此每个条目至少需要一个
## 虚拟值“ - ”。
##

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

讨论

第二个 RewriteCond 假设您已启用 HostNameLookups,以便解析客户端 IP 地址。如果不是这种情况,您应该删除第二个 RewriteCond,并从第一个 RewriteCond 中删除[OR]标志。

top

基于 Referer 的转向器

描述

根据请求来源的 Referer 重定向请求,每个 Referer 都有不同的目标。

解决方案

以下规则集使用映射文件将每个 Referer 与重定向目标相关联。

RewriteMap  deflector "txt:/path/to/deflector.map"

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}}" "=-"
RewriteRule "^" "%{HTTP_REFERER}" [R,L]

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]

映射文件列出了每个 referer 的重定向目标,或者,如果我们只想将它们重定向回他们来自的地方,则在映射中放置一个“ - ”

##
##  deflector.map
##

http://badguys.example.com/bad/index.html    -
http://badguys.example.com/bad/index2.html   -
http://badguys.example.com/bad/index3.html   http://somewhere.example.com/

可用语言:  en  |  fr 

top

评论

注意
这不是一个问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们已实施或被认为无效/偏离主题,则我们的版主可能会将其删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表