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

如何白名单/feature_flags/{featureFlagName}路径但拒绝其子路径?

可以实现,核心是精确匹配主路径+拦截子路径

完全可以做到只允许/feature_flags/{featureFlagName}这类主路径,拦截所有带后续子路径的请求(比如/feature_flags/{featureFlagName}/business/{businessId}或/feature_flags/{featureFlagName}/xx)。下面分常见场景给出具体实现思路:

API网关层面实现

Nginx配置示例

通过正则匹配区分主路径和子路径,先放行主路径,再拦截所有子路径:

# 匹配并放行主路径:/feature_flags/xxx(无后续子路径)
location ~* ^/feature_flags/[^/]+$ {
    proxy_pass http://your-backend-service;
    # 其他必要配置(如请求头转发、超时设置等)
}

# 匹配并拦截所有主路径下的子路径
location ~* ^/feature_flags/[^/]+/.+$ {
    return 403; # 返回403禁止访问,也可根据需求返回404或重定向
}

Spring Cloud Gateway配置示例

通过路由断言分别配置放行和拦截规则:

spring:
  cloud:
    gateway:
      routes:
        # 放行主路径请求
        - id: allow_feature_flag_root
          uri: lb://your-target-service
          predicates:
            - Path=/feature_flags/{featureFlagName}
        # 拦截所有主路径下的子路径
        - id: block_feature_flag_subpaths
          predicates:
            - Path=/feature_flags/{featureFlagName}/**
          filters:
            - SetStatus=403 # 直接返回403状态码

应用内路由拦截实现

Spring Boot(Spring MVC)拦截器示例

自定义拦截器,通过正则匹配判断请求路径:

@Component
public class FeatureFlagPathInterceptor implements HandlerInterceptor {
    private final Pattern ALLOWED_PATTERN = Pattern.compile("^/feature_flags/[^/]+$");
    private final Pattern BLOCKED_PATTERN = Pattern.compile("^/feature_flags/[^/]+/.+$");

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestUri = request.getRequestURI();
        if (BLOCKED_PATTERN.matcher(requestUri).matches()) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access to subpaths is denied");
            return false;
        }
        // 仅允许匹配主路径的请求,或放行其他非相关路径
        return ALLOWED_PATTERN.matcher(requestUri).matches() || true;
    }
}

Express.js路由示例

通过路由顺序优先匹配主路径,再拦截所有子路径:

// 先定义主路径的处理逻辑,优先匹配
app.get('/feature_flags/:featureFlagName', (req, res) => {
    // 处理合法请求逻辑
    res.status(200).json({status: "allowed", data: {}});
});

// 拦截所有主路径下的子路径请求
app.all('/feature_flags/:featureFlagName/*', (req, res) => {
    res.status(403).json({status: "denied", message: "Subpaths are not allowed"});
});

核心逻辑总结

不管用哪种技术栈,核心思路都是:

  1. 精确匹配主路径:确保/feature_flags/{featureFlagName}这类无后续子路径的请求被放行;
  2. 匹配并拦截子路径:用通配符或正则匹配所有以/feature_flags/{featureFlagName}/开头的请求,直接返回禁止访问的状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:01:12