.htaccess根据查询字符串内容重定向

evrscar2  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个在线图像存档,其中一些位于云存储上。存档分为四个级别,使用查询字符串访问相应的级别:

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代码很有信心,通常依赖于比我聪明的人生成的代码片段。

5kgi1eie

5kgi1eie1#

RewriteCond %{QUERY_STRING} ^level=image$

这将检查查询字符串是否完全等于level=image,而在您的示例中,level URL参数只是多个参数中的一个(第一个)。
要检查URL参数level=image是否出现在查询字符串中的任何位置,请修改上面的 * condition *,如下所示:
x一个一个一个一个x一个一个二个x
小问题,但这将允许请求的主机名(例如example.com)仅作为引用站点的子域出现的引用站点。例如example.com.referrer.com。要解决此问题,请修改 * CondPattern * 以包含尾部斜杠或字符串结尾锚点。例如:
一个三个三个一个
不需要捕获子模式。如果你只需要规则对任何URL路径都成功,那么就使用^来避免遍历URL路径。但是在你的例子中,请求是a.php,而不是"任何URL"。
但为什么要"重定向",而不是简单地阻止请求呢?正如你所说,这毕竟是为"机器人"准备的。例如,要发送一个403禁止:

RewriteRule ^a\.php$ - [F]

总结如下:

RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1(/|$)
RewriteCond %{QUERY_STRING} (^|&)level=image($|&)
RewriteRule ^a\.php$ - [F]

但是,请注意,搜索引擎"机器人"通常根本不发送Referer报头,而且任意机器人伪造Referer报头并绕过您的拦截是微不足道的。

相关问题