Path
Match the targeted path of an incoming request against specific path criteria.
For more information, see the Kubernetes Gateway API documentation.
Before you begin
Follow the Get started guide to install Gloo Gateway.
Follow the Sample app guide to create a gateway proxy with an HTTP listener and deploy the httpbin sample app.
Get the external address of the gateway and save it in an environment variable.
Set up exact matching
Create an HTTPRoute resource for the
match.exampledomain that matches incoming requests on the/status/200exact path.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-match namespace: httpbin spec: parentRefs: - name: http namespace: gloo-system hostnames: - match.example rules: - matches: - path: type: Exact value: /status/200 backendRefs: - name: httpbin port: 8000 EOFSend a request to the
/status/200path of the httpbin app on thematch.exampledomain. Verify that you get back a 200 HTTP response code.Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < access-control-allow-credentials: true access-control-allow-credentials: true < access-control-allow-origin: * access-control-allow-origin: * < date: Sat, 04 Nov 2023 03:19:26 GMT date: Sat, 04 Nov 2023 03:19:26 GMT < content-length: 0 content-length: 0 < x-envoy-upstream-service-time: 1 x-envoy-upstream-service-time: 1 < server: envoy server: envoySend another request to the httpbin app. This time, use the
/headerspath. Because this path is not specified in the HTTPRoute, the request fails and a 404 HTTP response code is returned.Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < date: Tue, 23 Apr 2024 18:52:01 GMT date: Tue, 23 Apr 2024 18:52:01 GMT < server: envoy server: envoy < content-length: 0 content-length: 0
Set up prefix path matching
Create an HTTPRoute resource for the
match.exampledomain that matches incoming requests on the/anythingprefix path.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-match namespace: httpbin spec: parentRefs: - name: http namespace: gloo-system hostnames: - match.example rules: - matches: - path: type: PathPrefix value: /anything backendRefs: - name: httpbin port: 8000 EOFSend a request to the
/anything/team1path of the httpbin app on thematch.exampledomain. Verify that you get back a 200 HTTP response code.Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < access-control-allow-credentials: true access-control-allow-credentials: true < access-control-allow-origin: * access-control-allow-origin: * < date: Sat, 04 Nov 2023 03:19:26 GMT date: Sat, 04 Nov 2023 03:19:26 GMT < content-length: 0 content-length: 0 < x-envoy-upstream-service-time: 1 x-envoy-upstream-service-time: 1 < server: envoy server: envoySend another request to the httpbin app. This time, use the
/headerspath. Because this path is not specified in the HTTPRoute, the request fails and a 404 HTTP response code is returned.Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < date: Tue, 23 Apr 2024 18:52:01 GMT date: Tue, 23 Apr 2024 18:52:01 GMT < server: envoy server: envoy < content-length: 0 content-length: 0
Set up regex matching
Use RE2 syntax for regular expressions to match incoming requests.
Create an HTTPRoute resource for the
match.exampledomain that uses a regular expression (regex) to match incoming requests. The following regex patterns are defined in the example:\/.*my-path.*:- The request path must start with
/ - The expression
.*means that any character before and after themy-pathstring is allowed. - Allowed pattern:
/anything/this-is-my-path-1, not allowed:/anything.
- The request path must start with
/anything/stores/[^/]+?/entities:- The request path must start with
/anything/stores/. [^/]+?matches any character except/.- The request path must end with
/entities. - Allowed pattern:
/anything/stores/us/entities, not allowed:/anything/stores/us/south/entities.
- The request path must start with
/anything/(dogs|cats)/\\d[.]\\d.*- The request path must start with
/anything/, followed by eitherdogs/orcats/. \\dmatches a single digit.[.]matches a literal period.\\d.*matches a single digit followed by zero or any character.- Allowed pattern:
/anything/dogs/3.0-game, not allowed:/anything/birds
- The request path must start with
kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: httpbin-match namespace: httpbin spec: parentRefs: - name: http namespace: gloo-system hostnames: - "match.example" rules: - matches: - path: type: RegularExpression value: \/.*my-path.* - path: type: RegularExpression value: /anything/stores/[^/]+?/entities - path: type: RegularExpression value: /anything/(dogs|cats)/\\d[.]\\d.* backendRefs: - name: httpbin namespace: httpbin port: 8000 EOFSend multiple requests to the httpbin app on the
match.exampledomain./anything/this-is-my-path-1matches the regex pattern\/.*my-path.*/anything/stores/us/entitiesmatches the regex pattern/anything/stores/[^/]+?/entities/anything/dogs/3.0-gamematches the regex pattern/anything/(dogs|cats)/\\d[.]\\d.*
Verify that the requests succeed and that you get back a 200 HTTP response code.
Example output:
* Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < access-control-allow-credentials: true access-control-allow-credentials: true < access-control-allow-origin: * access-control-allow-origin: * < date: Sat, 04 Nov 2023 03:19:26 GMT date: Sat, 04 Nov 2023 03:19:26 GMT < content-length: 0 content-length: 0 < x-envoy-upstream-service-time: 1 x-envoy-upstream-service-time: 1 < server: envoy server: envoySend requests to the httpbin app that do not meet the defined regex patterns.
/anythingdoes not match the regex pattern\/.*my-path.*/anything/stores/us/south/entitiesdoes not match the regex pattern `/anything/stores/[^/]+?//anything/birds/1.1-gamedoes not match the regex pattern/anything/(dogs|cats)/\\d[.]\\d.*
Verify that all requests fail with a 404 HTTP response code, because the path does not match the regex pattern that you defined.
Example output:
* Request completely sent off < HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < server: envoy server: envoy < content-length: 0 content-length: 0
Cleanup
You can remove the resources that you created in this guide.
kubectl delete httproute httpbin-match -n httpbin