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

Express-Gateway同路径API路由分测试/生产环境转发问题求助

解决Express Gateway按Scope转发到不同环境的问题

你的问题核心在于Express Gateway的API端点匹配顺序:网关会按照你在apiEndpoints里定义的顺序依次检查请求,第一个匹配路径的端点会被优先选中。你的testEndpoint用了/*路径,会先匹配所有请求,但如果请求的凭证没有api_test scope,网关就直接返回404,不会继续检查后面的prodEndpoint。

下面是两种可行的解决方案,推荐第一种更简洁灵活的方式:

方案一:单个通用端点+条件路由(推荐)

我们可以定义一个匹配所有路径的通用API端点,然后在pipeline里根据请求携带的scope动态选择转发目标,同时完成scope合法性验证。

修改后的gateway.config.yml配置:

apiEndpoints:
  allRequests:
    host: *
    paths: '/*' # 匹配所有请求路径

serviceEndpoints:
  testService:
    url: "http://server_test.com"
  prodService:
    url: "http://server_prod.com"

policies:
  - proxy
  - key-auth # 这里假设你用key-auth做凭证验证,根据实际认证方式调整(比如oauth2)
  - scope
  - expression

pipelines:
  mainPipeline:
    apiEndpoints:
      - allRequests
    policies:
      # 第一步:验证凭证有效性
      - key-auth: {}
      # 第二步:确保请求至少拥有api_test或api_prod其中一个scope
      - scope:
          action:
            required: ["api_test", "api_prod"]
            operator: OR
      # 第三步:根据用户的scope动态设置转发目标
      - expression:
          action:
            jp: "`${request.user.scopes.includes('api_prod') ? 'prodService' : 'testService'}`"
            set: "serviceEndpoint"
      # 第四步:执行代理转发
      - proxy:
          action:
            serviceEndpoint: "{serviceEndpoint}" # 使用上面动态设置的服务端点

配置说明:

  1. 先通过key-auth验证凭证是否合法,确保请求来自已授权的应用
  2. scope policy过滤掉没有api_test或api_prod权限的非法请求
  3. expression policy通过简单的JS逻辑判断用户的scope,自动切换转发到测试或生产服务
  4. 最后用proxy完成请求转发,全程不需要客户端修改请求路径

方案二:调整端点顺序+路径前缀(不推荐,需修改客户端请求)

如果你一定要分开定义端点,可以把prodEndpoint放在testEndpoint前面,同时给测试环境的请求加专属前缀(比如/test/*),避免路径冲突:

apiEndpoints:
  prodEndpoint:
    host: *
    paths: '/*'
    scopes: ["api_prod"]
  testEndpoint:
    host: *
    paths: '/test/*' # 测试环境请求必须带/test前缀
    scopes: ["api_test"]

serviceEndpoints:
  testService:
    url: "http://server_test.com"
  prodService:
    url: "http://server_prod.com"

policies:
  - proxy

pipelines:
  prodEndpoint:
    apiEndpoints:
      - prodEndpoint
    policies:
      - proxy:
          action:
            serviceEndpoint: prodService
  testEndpoint:
    apiEndpoints:
      - testEndpoint
    policies:
      - proxy:
          action:
            serviceEndpoint: testService

这个方案需要客户端配合修改请求路径,灵活性较差,所以更推荐方案一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:17:32