阻止以字符串开头的请求

阻止以字符串开头的请求

我想阻止所有以 开头的请求,/search?q=因为它们会在我的服务器上产生不必要的负载。

关注此问题https://stackoverflow.com/questions/4640807/how-to-block-bot-requests-to-urls-that-match-a-common-pattern-in-apache,我尝试了以下代码:

<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/search?q=[^/] [NC]
RewriteRule ^.*$ - [F,L]
</Location>

但它阻止了太多 URL(例如以搜索开头的所有内容)

我尝试了不同的变体,但没有效果。正确的语法是什么?

答案1

但它阻止了太多 URL(例如以搜索开头的所有内容)

您发布的代码不会这样做吗?事实上,您发布的代码不太可能阻止任何内容,除非原始请求 URL 中有一个经过编码的 URL ?(即)?%3F

但是,为了匹配查询字符串(即q=),您需要匹配QUERY_STRING服务器变量。ApacheREQUEST_URI服务器变量仅包含 URL 路径(无查询字符串)。

因此,为了阻止所有启动的请求/search?q=,您将需要执行以下操作:

RewriteCond %{QUERY_STRING} ^q=
RewriteRule ^/?search$ - [F]

这可确保 URL 路径匹配/search且查询字符串以 开头q=

除非您还需要在查询字符串中NC匹配,否则不需要该标志。Q=

由于该标志是隐含的,因此L不需要使用该标志。F

更新:我将这些指令直接放在服务器配置中,因为我在此服务器上有许多虚拟主机(网站),并且我希望此规则适用于所有虚拟主机(网站)。

这可能是您的问题。服务器配置中的 mod_rewrite 指令默认被虚拟主机覆盖并被忽略。除非您专门启用 mod_rewrite 继承(这通常是从 vhost 容器中执行的),否则 vHost 不会从服务器配置中继承 mod_rewrite 指令。但是,在 Apache 2.4.8+ 上,您可以在主服务器配置中执行此操作(服务器上下文)。例如:

RewriteOptions InheritDownBefore

InheritDownBefore确保服务器配置中的指令被执行vhost 中的指令。

相关内容