Apache HTTP Server 版本 2.4
本文档是对 mod_rewrite
参考文档 的补充。它描述了如何使用 mod_rewrite
控制对各种资源的访问以及其他相关技术。这包括许多 mod_rewrite 常用示例,包括对每个示例如何工作的详细描述。
以下技术禁止其他网站在其页面中内联您的图像的做法。这种做法通常被称为“热链接”,会导致您的带宽被用来为其他人的网站提供内容。
此技术依赖于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>
在本食谱中,我们将讨论如何阻止来自特定机器人或用户代理的持久请求。
机器人排除的标准定义了一个文件/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
请求头即可。如果您遇到持续攻击,您应该考虑在更高级别(例如防火墙)阻止它。
我们希望维护一个主机列表,类似于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]
标志。
根据请求来源的 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/