如果查询字符串包含关键字,htaccess 发送 404

htaccess send 404 if query string contains keyword

我看到很多流量,我怀疑这些流量正在使用

的请求格式探测缺陷或漏洞利用
https://example.com/?testword

我想,当我进一步研究这个问题时,我可以节省资源并通过 404 或 500 响应中断或阻止这些请求

我试过了

RewriteEngine On
RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]

和查询字符串匹配的其他一些变体,但 none 在测试时似乎 return 404。我发现的其他问题寻找查询字符串 values/pairs 并重写它们,但似乎没有示例仅针对单个值退出。

RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]

这里有几个问题:

  • 你条件中的CondPattern被取反(!前缀),所以只有当testword 出现在查询字符串中。

  • RewriteRule 指令缺少 pattern(第一个)参数(或 substitution(第二个) 参数取决于你如何看待它)。 RewriteRule 指令仅匹配 URL-path。

  • 当您为 R 标志指定非 3xx 状态代码时,替换 将被忽略。您应该指定一个连字符 (-) 以指示 无替换

要测试 whole-word“testword”是否存在于查询字符串的任意位置,您可以使用正则表达式 \btestword\b - 其中 \b 字边界 。或者您可能只是希望正则表达式 testword - 在任何地方匹配“testword”,包括当它作为另一个词的一部分出现时?相比之下,正则表达式 (^|&)testword($|&) 会错过“testword”作为 URL 参数名称出现的实例。

请尝试以下操作:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^$ - [R=404]

这仅匹配主页(即空 URL-path)。指定非 3xx return 状态时不需要 L 标志,这是隐含的。

-(第二个参数)表示无替换。如上所述,当指定非 3xx HTTP 状态时,substitution 字符串无论如何都会被忽略。

要测试 any URL-path 然后只需删除 RewriteRule [=49 上的 $ (end-of-string 锚点) =]模式。例如:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^ - [R=404]

如果您的主页不接受任何查询字符串参数,那么当存在查询字符串时,您可以简单地拒绝请求(即 404 未找到)。例如:

RewriteCond %{QUERY_STRING} .
RewriteRule ^$ - [R=404]