如何配置Nginx基于X-my-lb-header头拦截流量,仅放行指定URI
实现方案
核心思路是利用Nginx的location匹配优先级规则,将允许公网访问的路径设置为高优先级匹配,其余路径统一做公网访问拦截,无需借助else语法即可实现需求。
完整配置示例
首先在Nginx配置的http块中添加变量映射(也可直接在location中判断请求头,map方式更易维护):
http { # 其余全局配置省略 # 标记是否为公网请求:无X-my-lb-header请求头则为公网请求,值为1 map $http_x_my_lb_header $is_public_req { default 1; ~. 0; } server { listen 443 ssl; # 你的域名、SSL证书等基础配置省略 # 精确匹配允许公网访问的/endpoint2路径,优先级最高 location = /endpoint2 { # 填写你的正常服务代理/处理配置 proxy_pass http://your_upstream_server; proxy_set_header Host $host; # 其余配置省略 } # 前缀匹配/endpoint1/开头的路径,^~修饰符保证优先级高于通用匹配 location ^~ /endpoint1/ { # 填写你的正常服务代理/处理配置 proxy_pass http://your_upstream_server; proxy_set_header Host $host; # 其余配置省略 } # 通用路径匹配,所有未命中上面两个规则的请求走这里 location / { # 公网请求直接返回404,内网请求正常放行 if ($is_public_req) { return 404; } # 填写你的正常服务代理/处理配置 proxy_pass http://your_upstream_server; proxy_set_header Host $host; # 其余配置省略 } } }
配置说明
- Nginx的location匹配优先级为:精确匹配
=> 带^~修饰符的前缀匹配 > 正则匹配 > 普通前缀匹配,因此公网请求访问两个允许的路径时会直接命中前两个location,不会走到拦截逻辑。 - 无需额外判断内网请求的请求头,前两个location对所有来源请求放行,完全符合需求。
- 若不想重复写代理配置,可以将公共代理参数抽成单独的配置文件,在各location中通过
include指令引入即可。 - 若不需要用map,也可以直接在通用location中直接判断请求头,效果一致:
location / { if ($http_x_my_lb_header = "") { return 404; } # 其余配置省略 }
安全注意事项
需在前端负载均衡器层面配置:所有公网入站请求携带的X-my-lb-header请求头必须被丢弃,避免攻击者伪造该请求头绕过公网访问限制。
内容的提问来源于stack exchange,提问作者Dimitrios
相关产品推荐
相关产品推荐

