我有一个在线图像存档,其中一些位于云存储上。存档分为四个级别,使用查询字符串访问相应的级别:
a.php?level=image&collection=a&document=b&item=72
级别可以是归档、集合、文档或图像。
我想阻止机器人访问实际的图像,主要是为了最小化云存储的流量。因此,如果他们发出一个查询字符串级别参数为image(“?level=image”)的请求,该请求将被转移。
下面的.htaccess
代码用于检查查询字符串是否有来自外部引用的请求,如果请求是图像,则将请求定向到其他地方:
RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1
RewriteCond %{QUERY_STRING} ^level=image$
RewriteRule (.*) https://a.co.uk/blank.htm [NC,R,L]
我的代码看起来没有明显的效果。有人能看出我做错了什么吗?我不假装对.htaccess
代码很有信心,通常依赖于比我聪明的人生成的代码片段。
1条答案
按热度按时间5kgi1eie1#
这将检查查询字符串是否完全等于
level=image
,而在您的示例中,level
URL参数只是多个参数中的一个(第一个)。要检查URL参数
level=image
是否出现在查询字符串中的任何位置,请修改上面的 * condition *,如下所示:x一个一个一个一个x一个一个二个x
小问题,但这将允许请求的主机名(例如
example.com
)仅作为引用站点的子域出现的引用站点。例如example.com.referrer.com
。要解决此问题,请修改 * CondPattern * 以包含尾部斜杠或字符串结尾锚点。例如:一个三个三个一个
不需要捕获子模式。如果你只需要规则对任何URL路径都成功,那么就使用
^
来避免遍历URL路径。但是在你的例子中,请求是a.php
,而不是"任何URL"。但为什么要"重定向",而不是简单地阻止请求呢?正如你所说,这毕竟是为"机器人"准备的。例如,要发送一个403禁止:
总结如下:
但是,请注意,搜索引擎"机器人"通常根本不发送
Referer
报头,而且任意机器人伪造Referer
报头并绕过您的拦截是微不足道的。