我看到很多流量,我怀疑这些流量是在用的请求格式探测缺陷或漏洞
https://example.com/?testword
我想,当我进一步研究这个问题时,我可以节省资源,并通过404或500响应来干扰或阻止这些请求
我试过
RewriteEngine On
RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]
查询字符串上的其他一些变体匹配,但在测试时似乎没有返回404。我发现的其他问题是查找查询字符串值/对并重写它们,但似乎没有任何例子只针对单个值。
RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC] RewriteRule https://example.com/ [L,R=404]
这里有几个问题:
-
条件中的CondPattern被否定(
!
前缀(,因此只有当查询字符串中不存在testword
时才成功。 -
RewriteRule
指令缺少模式(第一个(参数(或替换的第二个(参数,具体取决于您如何看待它(。RewriteRule
指令仅与URL路径匹配。 -
为
R
标志指定非3xx状态代码时,将忽略替换。您应该指定一个连字符(-
(来表示没有替换。
为了测试整个单词";测试词";在查询字符串中的任何位置存在,则可以使用正则表达式btestwordb
-其中b
是单词边界。或者您可能只是希望正则表达式testword
-与";测试词";在任何地方,包括当它作为另一个单词的一部分出现时?相比之下,正则表达式(^|&)testword($|&)
将错过";测试词";显示为URL参数名称。
请尝试以下操作:
RewriteCond %{QUERY_STRING} btestwordb [NC]
RewriteRule ^$ - [R=404]
这只匹配主页(即空的URL路径(。指定非3xx返回状态时不需要L
标志,这是隐含的。
-
(第二个参数(表示没有替换。如上所述,当指定非3xx HTTP状态时,替换字符串将被忽略。
要测试任何URL路径,只需删除RewriteRule
模式上的$
(字符串末尾锚点(。例如:
RewriteCond %{QUERY_STRING} btestwordb [NC]
RewriteRule ^ - [R=404]
如果你的主页不接受任何查询字符串参数,那么当存在查询字符串时,你可以简单地拒绝请求(即404未找到(。例如:
RewriteCond %{QUERY_STRING} .
RewriteRule ^$ - [R=404]