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

Apache 如果查询字符串包含关键字,则htaccess发送404,apache,.htaccess,request.querystring,Apache,.htaccess,Request.querystring,我看到很多流量,我怀疑这些流量是在探测请求格式的漏洞或漏洞 https://example.com/?testword 我想,当我进一步研究这个问题时,我可以通过404或500响应来节省资源、中断或阻止这些请求 我试过了 RewriteEngine On RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC] RewriteRule https://example.com/ [L,R=404] 和查询字符串上的一些其他变体匹配

我看到很多流量,我怀疑这些流量是在探测请求格式的漏洞或漏洞

https://example.com/?testword
我想,当我进一步研究这个问题时,我可以通过404或500响应来节省资源、中断或阻止这些请求

我试过了

RewriteEngine On
RewriteCond %{QUERY_STRING} !(^|&)testword($|&) [NC]
RewriteRule https://example.com/ [L,R=404]
和查询字符串上的一些其他变体匹配,但在测试时似乎没有返回404。我发现的其他问题是查找查询字符串值/对并重写它们,但似乎没有针对单个值的示例

这里有几个问题:

  • 条件中的CondPattern被否定(
    前缀),因此只有当查询字符串中不存在
    测试词时,它才会成功

  • RewriteRule
    指令缺少模式(第一个)参数(或替换(第二个)参数,具体取决于您如何看待它)。
    RewriteRule
    指令仅与URL路径匹配

  • R
    标志指定非3xx状态代码时,将忽略替换。您应该指定一个连字符(
    -
    )来表示没有替换

要测试整个单词“testword”是否存在于查询字符串中的任何位置,可以使用regex
\btestword\b
-其中
\b
是单词边界。或者您只是想让regex
testword
-在任何地方都与“testword”匹配,包括当它作为另一个单词的一部分出现时?相比之下,regex
(^ |&)testword($|&)
将错过“testword”作为URL参数名称出现的实例

请尝试以下操作:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^$ - [R=404]
这仅与主页匹配(即空URL路径)。当指定非3xx返回状态时,
L
标志不是必需的,这是隐含的

-
(第二个参数)表示没有替换。如上所述,在指定非3xx HTTP状态时,替换字符串仍将被忽略

要测试任何URL路径,只需删除
重写规则
模式上的
$
(字符串结束锚定)。例如:

RewriteCond %{QUERY_STRING} \btestword\b [NC]
RewriteRule ^ - [R=404]
RewriteCond %{QUERY_STRING} .
RewriteRule ^$ - [R=404]
如果您的主页不接受任何查询字符串参数,那么您可以在存在查询字符串时简单地拒绝请求(即404 Not Found)。例如:

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

404不是重定向,因此R=404没有意义,您可以更改该标志,同时使用F(403禁止)或G(410消失),也许您想给mod_安全性一个外观。并且您在条件中的表达式需要反转。如果查询字符串中存在测试字,则需要重定向,因此否定(!)在条件中没有任何意义。@on8tom
R=404
完全有意义。
R
标志是多用途的。它不仅仅用于外部重定向。指定非3xx HTTP状态时,行为不同。(正如您可以将非3xx状态代码与mod_alias
Redirect
RedirectMatch
指令一起使用。)