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

如何配置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;
            # 其余配置省略
        }
    }
}

配置说明

  1. Nginx的location匹配优先级为:精确匹配= > 带^~修饰符的前缀匹配 > 正则匹配 > 普通前缀匹配,因此公网请求访问两个允许的路径时会直接命中前两个location,不会走到拦截逻辑。
  2. 无需额外判断内网请求的请求头,前两个location对所有来源请求放行,完全符合需求。
  3. 若不想重复写代理配置,可以将公共代理参数抽成单独的配置文件,在各location中通过include指令引入即可。
  4. 若不需要用map,也可以直接在通用location中直接判断请求头,效果一致:
    location / {
        if ($http_x_my_lb_header = "") {
            return 404;
        }
        # 其余配置省略
    }
    

安全注意事项

需在前端负载均衡器层面配置:所有公网入站请求携带的X-my-lb-header请求头必须被丢弃,避免攻击者伪造该请求头绕过公网访问限制。

内容的提问来源于stack exchange,提问作者Dimitrios

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:18:01