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
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: agentgateway-proxy namespace: agentgateway-system hostnames: - match.example rules: - matches: - path: type: Exact value: /status/200 backendRefs: - name: httpbin port: 8000 EOF -
Send a request to the
/status/200path of the httpbin app on thematch.exampledomain. Verify that you get back a 200 HTTP response code.
curl -vi http://$INGRESS_GW_ADDRESS:80/status/200 -H "host: match.example"curl -vi localhost:8080/status/200 -H "host: match.example"Example output:
* Request completely sent off < 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: * < content-length: 0 content-length: 0 -
Send 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.curl -vi http://$INGRESS_GW_ADDRESS:80/headers -H "host: match.example"curl -vi localhost:8080/headers -H "host: match.example"Example output:
< HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < content-length: 9 content-length: 9 < content-type: text/plain; charset=utf-8 content-type: text/plain; charset=utf-8
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: agentgateway-proxy namespace: agentgateway-system hostnames: - match.example rules: - matches: - path: type: PathPrefix value: /anything backendRefs: - name: httpbin port: 8000 EOF -
Send a request to the
/anything/team1path of the httpbin app on thematch.exampledomain. Verify that you get back a 200 HTTP response code.
curl -vi http://$INGRESS_GW_ADDRESS:80/anything/team1 -H "host: match.example"curl -vi localhost:8080/anything/team1 -H "host: match.example"Example output:
< 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: * < content-type: application/json; encoding=utf-8 content-type: application/json; encoding=utf-8 < content-length: 304 content-length: 304 < { "args": {}, "headers": { "Accept": [ "*/*" ], "Host": [ "match.example" ], "User-Agent": [ "curl/8.7.1" ] }, "origin": "10.xxx.x.xx:35204", "url": "http://match.example/anything/team1", "data": "", "files": null, "form": null, "json": null } -
Send 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.curl -vi http://$INGRESS_GW_ADDRESS:80/headers -H "host: match.example"curl -vi localhost:8080/headers -H "host: match.example"Example output:
< HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < content-length: 9 content-length: 9 < content-type: text/plain; charset=utf-8 content-type: text/plain; charset=utf-8
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: agentgateway-proxy namespace: agentgateway-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 EOF -
Send 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.
curl -vi http://$INGRESS_GW_ADDRESS:80/anything/this-is-my-path-1 -H "host: match.example" curl -vi http://$INGRESS_GW_ADDRESS:80/anything/stores/us/entities -H "host: match.example" curl -vi http://$INGRESS_GW_ADDRESS:80/anything/dogs/3.0-game -H "host: match.example"curl -vi localhost:8080/anything/this-is-my-path-1 -H "host: match.example" curl -vi localhost:8080/anything/stores/us/entities -H "host: match.example" curl -vi localhost:8080/anything/dogs/3.0-game -H "host: match.example"Example output:
< 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: * < content-type: application/json; encoding=utf-8 content-type: application/json; encoding=utf-8 < content-length: 317 content-length: 317 < { "args": {}, "headers": { "Accept": [ "*/*" ], "Host": [ "match.example" ], "User-Agent": [ "curl/8.7.1" ] }, "origin": "10.xxx.x.xx:43182", "url": "http://match.example/anything/stores/us/entities", "data": "", "files": null, "form": null, "json": null } -
Send 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.
curl -vi http://$INGRESS_GW_ADDRESS:80/anything -H "host: match.example" curl -vi http://$INGRESS_GW_ADDRESS:80/anything/stores/us/south/entities -H "host: match.example" curl -vi http://$INGRESS_GW_ADDRESS:80/anything/birds/1.1-game -H "host: match.example"curl -vi localhost:8080/anything -H "host: match.example" curl -vi localhost:8080/anything/stores/us/south/entities -H "host: match.example" curl -vi localhost:8080/anything/birds/1.1-game -H "host: match.example"Example output:
< HTTP/1.1 404 Not Found HTTP/1.1 404 Not Found < content-length: 9 content-length: 9 < content-type: text/plain; charset=utf-8 content-type: text/plain; charset=utf-8
Cleanup
You can remove the resources that you created in this guide.kubectl delete httproute httpbin-match -n httpbin