如何在Nginx中拒绝所有URI,仅放行指定单个URL?
解决方案:Nginx仅放行指定URL,拦截其余请求
没问题,这事儿在Nginx里很好实现,核心就是精准匹配你要放行的/page?param=something(包括查询参数),剩下的请求直接拦截。给你两种靠谱的方案,按需选择:
方案一:精确匹配+参数校验(最常用)
这种方案逻辑直接,适合单一规则的场景,先精准匹配URI为/page的请求,再校验查询参数param的值是否为something,符合条件就放行,否则和其他所有请求一起拦截。
配置代码如下:
server { listen 80; server_name your-domain.com; # 替换成你的实际域名 # 仅放行URI为/page且param=something的请求 location = /page { # 校验查询参数param的值 if ($arg_param != "something") { return 403; # 参数不符,直接拦截(返回403禁止访问) } # 这里写你正常的业务处理逻辑,比如反向代理到后端或者指向静态文件 # 示例:proxy_pass http://your-backend-service; # 示例:root /var/www/your-site; } # 拦截所有其他未匹配的请求 location / { return 403; # 也可以改成return 404; 返回未找到 } }
关键细节说明:
location = /page是精确匹配,只会匹配URI严格等于/page的请求,不会匹配/page/、/page1这类相似路径,保证精准度。$arg_param是Nginx内置变量,直接获取查询参数中param的值,不用自己解析URL。- 如果需要忽略大小写(比如允许
Param=Something),可以把判断改成if ($arg_param !~* "^something$"),用不区分大小写的正则匹配。
方案二:用map指令统一管理(适合多规则场景)
如果以后可能要添加更多放行规则,用map指令会更清晰,它可以根据完整请求URI(包含查询参数)统一设置是否允许访问的变量。
配置代码如下:
# 在server块外部定义map规则 map $request_uri $allow_access { default 0; # 默认不允许访问 ~^/page\?param=something$ 1; # 匹配到目标URL则允许访问 } server { listen 80; server_name your-domain.com; # 根据map变量判断是否拦截 if ($allow_access = 0) { return 403; } # 处理允许的请求 location = /page { # 你的业务处理逻辑 } }
配置后必做步骤:
- 用
nginx -t命令检查配置文件语法是否正确,确保没有拼写错误。 - 确认无误后,执行
nginx -s reload重启Nginx使配置生效。
内容的提问来源于stack exchange,提问作者Naresh
相关产品推荐
相关产品推荐

