![阻止以字符串开头的请求](https://linux22.com/image/733434/%E9%98%BB%E6%AD%A2%E4%BB%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%BC%80%E5%A4%B4%E7%9A%84%E8%AF%B7%E6%B1%82.png)
我想阻止所有以 开头的请求,/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 中的指令。