<-
Apache HTTP 服务器 2.4 > 使用mod_rewrite控制访问

使用mod_rewrite控制访问

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

请注意,这些示例中的许多示例在您的特定服务器配置中都不会起作用,因此,理解它们,而不只是将示例剪切并粘贴到您的配置中,这一点很重要。
支持Apache!

也可以看看

最佳

禁止图片“热链接”

描述:

以下技术禁止在其他网站上进行其他操作,包括在页面中内嵌图像。这种做法通常称为“热链接”,导致您的带宽被用于为其他人的站点提供内容。

解:

此技术依赖于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从location 调用的机器人 /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
##
## ATTENTION! This is a map, not a list, even when we treat it as such.
## mod_rewrite parses it for key/value pairs, so at least a
## dummy value "-" must be present for each entry.
##

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

讨论:

第二个RewriteCond假定您已打开HostNameLookups,以便将解析客户端IP地址。如果不是这种情况,则应删除第二个RewriteCond,并删除[OR]第一个RewriteCond中的 标志。

最佳

基于引用者的偏转器

描述:

根据请求来自的引荐来源重定向请求,每个引荐来源具有不同的目标。

解:

以下规则集使用映射文件将每个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]

映射文件列出了每个引荐来源网址的重定向目标,或者,如果我们仅希望重定向回它们的来源,则在映射中放置一个“-”:

##
##  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/

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。