首页 > 解决方案 > Spring cloud gateway Path Route Predicate 匹配失败

问题描述

在以下 Spring Cloud Gateway 配置中,我试图匹配以 结尾的路径/favicon.ico,但它无法匹配路径:/gitBooks/100/abc/favicon.ico

spring:
  cloud:
    gateway:
      routes:
        - id: favicon
          uri: forward:///favicon.ico
          predicates:
            - Path=**/favicon.ico

spring 云网关打印以下日志:

2020-02-04 22:57:35.703 TRACE 28356 --- [ctor-http-nio-2] o.s.c.g.h.p.RoutePredicateFactory        : Pattern "[**/favicon.ico]" does not match against value "/gitBooks/100/abc/favicon.ico"
2020-02-04 22:57:35.703 TRACE 28356 --- [ctor-http-nio-2] o.s.c.g.h.RoutePredicateHandlerMapping   : No RouteDefinition found for [Exchange: GET http://localhost:8080/gitBooks/100/abc/favicon.ico]

我不明白,我想知道如何编写路径预测器以匹配路径结尾favicon.ico

标签: spring-cloud-gateway

解决方案


我不知道为什么 PathMatcher 不起作用,最后我写了一个自定义的 Predicate:

spring:
  cloud:
    gateway:
      routes:
        - id: favicon
          uri: forward:///favicon.ico
          predicates:
            - Favicon=
@Component
public class FaviconRoutePredicateFactory extends AbstractRoutePredicateFactory<FaviconRoutePredicateFactory.Config> {
    private static final Log log = LogFactory.getLog(FaviconRoutePredicateFactory.class);


    public FaviconRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            String path = exchange.getRequest().getURI().getRawPath();
            return !path.equals("/favicon.ico") && path.endsWith("favicon.ico");
        };
    }

    public static class Config {
    }
}

推荐阅读