Nginx Location拦截含?s=查询字符串的URL失败求助
Nginx拦截重复
s=请求的正确配置方法 你当前的配置失效的核心原因是:Nginx的location指令仅匹配请求的URI路径部分(即?之前的内容),不会处理?之后的查询字符串。所以你写的location ~* \?s=根本无法匹配到目标请求里的查询参数部分。
正确的解决方案
方法一:用if指令直接匹配查询参数
在你的server块中添加以下规则(放在所有location指令之前):
if ($args ~* "s=/?s=") { return 404; }
这个规则会匹配查询参数中包含s=/?s=的请求,刚好命中你提到的那种重复嵌套s=的恶意请求。如果要匹配2次及以上的重复模式,可以把正则改成~* "(s=/?){2,}"。
方法二:用map指令实现高效匹配(适合多规则场景)
如果后续需要添加更多拦截规则,map指令的性能更优。先在http块或当前server块的上方添加:
map $args $block_bad_query { default 0; # 匹配包含重复s=的查询参数 ~*s=/?s= 1; }
然后在server块内添加:
if ($block_bad_query) { return 404; }
验证配置
修改完成后,执行以下命令验证配置正确性并重载Nginx:
nginx -t nginx -s reload
内容的提问来源于stack exchange,提问作者William Turrell
相关产品推荐
相关产品推荐

