You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:27:40