如何白名单/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"}); });
核心逻辑总结
不管用哪种技术栈,核心思路都是:
- 精确匹配主路径:确保
/feature_flags/{featureFlagName}这类无后续子路径的请求被放行; - 匹配并拦截子路径:用通配符或正则匹配所有以
/feature_flags/{featureFlagName}/开头的请求,直接返回禁止访问的状态码。
内容的提问来源于stack exchange,提问作者Mankind1023
相关产品推荐
相关产品推荐

