我正在尝试使用 Nginx Location 来阻止类似这样的请求,这些请求会导致 WordPress(和多语言 WPML 插件)出现加载问题:
GET /foo/bar/?s=/?s=/?s=/?s=/?s=/?s=/?s=/?s=/?s=/?s=/ HTTP/1.1
但是将其简化为以下内容并不匹配:
location ~* \?s= {
return 404;
}
即使我已经:
- 将其置于所有其他位置指令之上
- 逃脱了
?
,但没有逃脱=
(也尝试过) - 删除
^
并$
避免斜线造成任何混淆 - 用于
~*
不区分大小写
(我可以确认它将location foobar
正确匹配 URL 中任何位置的“foobar”。)
指令
location
(以及rewrite
指令)适用于规范化的URI,其中不包含查询部分。您无法使用location
或rewrite
指令测试请求查询字符串。您可以做的是检查
$arg_s
nginx 变量:s
但是,如果您的请求中有一个空的查询参数,则此方法将不起作用,例如:或者,您可以使用变量检查查询字符串是否存在于请求中
$args
:或者,使用以下正则表达式来阻止带有
s
查询参数的请求,无论其是否为空:PCRE 正则表达式是正确的。根据以下来源,针对 nginx 使用的 Perl(Perl 兼容正则表达式的来源)进行测试:
不匹配的原因是,位置 { } 匹配仅与 URL 匹配,而不是 URI(包含参数)。
因此,位置匹配块中 ? 后面的所有内容都将被忽略。
解决这个问题的方法是使用完整的 uri 来匹配,而不仅仅是 URL:
或者如果你想包含/foo/bar: