NGINX多条件if配置需求:满足指定URL参数则允许访问否则返回403
NGINX 403访问控制配置方案
你的需求是仅允许abc.com/abc.m3u8?token=abcd这类请求访问,其余全部返回403。当前的配置逻辑存在错误,无法实现预期效果,下面给出两种可靠的配置方案:
方案一:用Location拆分逻辑(推荐)
这种方式更符合NGINX的配置最佳实践,避免复杂的if嵌套问题:
server { server_name abc.com; # 精准匹配abc.m3u8请求 location ~* /abc.m3u8$ { # 校验token参数是否为abcd,不匹配则返回403 if ($arg_token !~* "^abcd$") { return 403; } # 此处添加正常的资源处理逻辑,比如代理到后端或指定文件路径 # root /path/to/your/files; # 或 proxy_pass http://your-backend; } # 所有其他请求直接返回403 location / { return 403; } }
方案二:单IF逻辑判断
如果想在全局用单个if实现,需要修正逻辑表达式:
server { server_name abc.com; # 只要不满足「URI是abc.m3u8 且 token是abcd」,就返回403 if (!($uri ~* "/abc.m3u8$") || !($arg_token ~* "^abcd$")) { return 403; } # 正常处理逻辑 }
原配置无效的原因
你写的条件是$uri !~* "^(.*)/(abc.m3u8)(.*)" && $arg_token !~* "abcd",意思是**同时满足「URI不含abc.m3u8」和「token不是abcd」**才返回403。但以下两种情况会绕过403,不符合需求:
- URI是abc.m3u8但token不对
- URI不是abc.m3u8但token是abcd
内容的提问来源于stack exchange,提问作者Riki Aji
相关产品推荐
相关产品推荐

