提问者:小点点

Spring Cloud Gateway:重写传入请求中的URI


我对Spring Cloud Gateway很陌生,对我的正则表达式也很生疏。我在谷歌上搜索过,但还没有找到答案。事实上,这是我20年职业生涯中关于stackoverflow的第一篇文章:)

我正在尝试允许流量进入host1.com/enablement/requests并将其转发到host2.com/enablement/request.注意第二个URI中缺少s。我还没有看到任何如何重写网址的示例。是因为我忽略了一个简单的正则表达式吗?

我在许多例子中看到过这个。你能解释一下它在做什么吗?

- RewritePath=/enablement/workflow(?<segment>/?.*), $\{segment}
spring:
  cloud:
    gateway:
      routes:
        - id: data_service_route
          uri: host2.com/enablement
          predicates:
            - Path=/enablement/requests
            - Method=POST,GET,PUT
          filters:
            - RewritePath=???

任何建议/例子将不胜感激。

杰夫


共1个答案

匿名用户

过去几天我一直在玩spring-cloud-网关,让我试着解释一下:

RewritePath=/enablement/workflow(?<segment>/?.*), $\{segment}

这里有2个表达式,由逗号分隔,一个用于模式匹配的正则表达式和替换字符串。

(?

$\{段}是替换字符串-在本例中,这将是捕获的组段的值。转义(yaml)需要反冲\。

所以/enablement/workflow/endpoint变成了/endpoint

下面是一个非常基本的代码片段:

        String regexp = "/enablement/requests/(?<path>.*)";
        String replacement = "/enablement/request/${path}";
        String path = "hostname:port/enablement/requests/endpoint";

        System.out.println(path.replaceAll(regexp, replacement));

下面是刷新正则表达式的一个非常有用的链接:

https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285

链接到下面的相关spring-cloud-网关类:

https://github.com/spring-cloud/spring-cloud-gateway/blob/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/route/builder/GatewayFilterSpec.java https://github.com/spring-cloud/spring-cloud-gateway/blob/main/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/filter/factory/RewritePathGatewayFilterFactory.java