如果查询字符串包含关键字,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]
我看到很多流量,我怀疑这些流量正在使用
的请求格式探测缺陷或漏洞利用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]