Path
Verified Code examples on this page have been automatically tested and verified.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 an agentgateway proxy.
- Install the httpbin sample app.
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 EOFSend 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: 0Send 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 EOFSend 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 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.
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 --ignore-not-found