如何在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
相关产品推荐
相关产品推荐

