J collinge
J collinge

Reputation: 41

spring cloud gateway, can you exclude paths (do a global !=)

I'm hoping someone can provide some ideas here. I'm playing around with some of the sample apps for the spring cloud gateway and going through the docs but I'm not seeing any way to route to self or do a global ignore. The idea here is that there are some paths that ALWAYS need to point to self, like for the actuator, and other that may need a global block (maybe for security reasons like you've found a severe vulnerability and need to disable access to a specific resource). Right now from what I can tell there is no way to do this, but I hope I'm wrong!

I've set up the app with the actuator running on port 8081 and the server on 8080. I've got two simple rules:

  - id: local_test_1
    uri: http://localhost:80
    order: 9000
    predicates:
    - Path=/echo
  # =====================================
  - id: local_test_2
    uri: ${test.uri}
    order: 10000
    predicates:
    - Path=/**

But the universal /** makes sure that any call to localhost:8081/actuator/* also gets routed to the uri. How can I exempt the management port from routing rules so the server itself will deal with the request?

I thought a default filter like - Path!=${management.server.port}/* might work, but it seems that != isn't supported.

Upvotes: 4

Views: 7975

Answers (4)

Sherwin F
Sherwin F

Reputation: 763

I ran into this same problem when using a default route, but also needing to serve a custom post-logout page from the classpath. The default route would handle the request instead of the gateway itself. Without the default route the logout.html was served correctly.

I ended up moving the default route to a Java bean and used the fluent API like this:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("default", r -> r
                .order(Ordered.LOWEST_PRECEDENCE)
                .path("/**")
                .and().not(p -> p.path("/logout.html", "/logout.css"))
                .uri("http://localhost:8080")
            )
            .build();
}

If someone knows of a way to do negation in the .yml configuration files that would be ideal, but I have yet to find an example of that in any docs.

Upvotes: 2

nader abolfazli
nader abolfazli

Reputation: 43

maybe you can use - Path=/** and - setStatus=404 for its filter and for actuator route - Path=/actuator/** and - setStatus=ACCEPTED don't forget to uri: no://op for both

Upvotes: 0

Pan Jie
Pan Jie

Reputation: 1

  - id: local_test_1
    uri: http://localhost:80
    order: 9000
    predicates:
      - Path=/echo
  # =====================================
  - id: local_test_2
    uri: ${test.uri}
    order: 10000
    predicates:
      - Path=/**

Try add two space before - Path, the problem may be you config is not working.

Upvotes: 0

hms
hms

Reputation: 35

You can use no://op as value for uri:.

The only disadvantage, that I see, is that any endpoint, which is not supposed to be found (like /actuator/foo) would still return 200 OK.

Upvotes: 0

Related Questions