如何在Spring Cloud Gateway中编写谓词匹配不含特定字符的请求?
解决Spring Cloud Gateway路由匹配不含特定内容的请求问题
你当前配置的问题在于错误地将正则表达式作为Path断言的参数,Path断言仅接受路径匹配模式(如/api/**),不支持附加正则规则。这就导致Path=/api/**, regex=^((?!test:abc).)*$实际上是让Path断言匹配/api/**或regex=^((?!test:abc).)*$这两个路径模式,所有/api/**的请求都会命中该路由,正则规则完全没生效。
要实现匹配不含特定内容的请求,需根据检查的内容位置选择对应断言组合:
场景1:匹配路径中不含"test:abc"的/api/**请求
使用Path限定路径前缀,再用Regex断言做负向匹配,两者为逻辑与关系:
- id: sensitiveDataPath uri: http://example.org predicates: - Path=/api/** - Regex=^/api/((?!test:abc).)*$ filters: - SetStatus=401
正则^/api/((?!test:abc).)*$通过负向预查,确保完整请求路径中不包含test:abc片段。
场景2:匹配请求参数/Header中不含"test:abc"的/api/**请求
如果需要检查的是请求参数、Header等其他位置,可结合对应断言加正则:
检查请求参数(任意参数值不含)
- id: sensitiveDataPath uri: http://example.org predicates: - Path=/api/** - Query=*, ^((?!test:abc).)*$ filters: - SetStatus=401
检查指定Header字段值不含
- id: sensitiveDataPath uri: http://example.org predicates: - Path=/api/** - Header=X-Custom-Header, ^((?!test:abc).)*$ filters: - SetStatus=401
内容的提问来源于stack exchange,提问作者devtomaster
相关产品推荐
相关产品推荐

