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

如何在Nginx中拒绝所有包含波浪号(~)的URI并返回403状态码

如何在Nginx中拒绝所有包含波浪号(~)的URI并返回403状态码

嗨,我来帮你搞定这个需求!你想要让任何包含波浪号(~)的请求——不管是路径里像https://example.com/~/item-1/,还是参数里像https://example.com/item1?status=~pending——都返回403状态码,对吧?这里有两种实用的方案,你可以按需选择:

方案一:直接用if指令匹配(简单高效)

这是最直接的方式,不需要额外的map配置,直接在server块里添加以下规则:

if ($request_uri ~* "~") {
    return 403;
}

说明:

  • $request_uri会包含完整的请求URI(包括后面的查询参数),刚好能覆盖你提到的两种场景;
  • ~*表示不区分大小写的正则匹配(不过波浪号本身没有大小写,所以用~也可以);
  • 只要请求里出现~,就会触发return 403,直接返回禁止访问的状态码。

方案二:基于你思路的map实现

如果你更倾向于用map来处理,也可以完善你的配置,具体如下:

# 在server块外定义map
map $request_uri $block_flag {
    ~* "~" 1;  # 匹配到~就标记为1
    default 0; # 其他情况标记为0
}

server {
    # 你的其他server配置(比如listen、server_name等)

    # 根据标记判断是否返回403
    if ($block_flag) {
        return 403;
    }

    # 你的其他路由或静态文件处理配置
    try_files $uri $uri/ =404;
}

或者如果你想坚持用try_files的方式,也可以这样写:

map $request_uri $filefromarg {
    ~* "~" @block_request; # 匹配到~就指向命名location
    default $request_uri;   # 其他情况正常使用request_uri
}

server {
    # 其他配置...

    try_files $filefromarg $uri =403;

    # 定义命名location返回403
    location @block_request {
        return 403;
    }
}

关于正则的说明

其实你困惑的正则部分很简单:因为波浪号~在正则表达式里不属于特殊字符(除非是作为匹配操作符),所以直接写"~"就能精准匹配到这个符号啦。

总的来说,方案一最简洁高效,推荐优先使用,完全能满足你的需求!

备注:内容来源于stack exchange,提问作者Cheruiyot Felix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:03:08