Host rewrites
Replace the host header value before forwarding a request to a backend service by using the URLRewrite filter.
For more information, see the Kubernetes Gateway API documentation.
Before you begin
- Set up an agentgateway proxy.
- Install the httpbin sample app.
In-cluster service host rewrites
-
Create an HTTPRoute resource for the httpbin app that uses the
URLRewritefilter to rewrite the hostname of the request. In this example, all incoming requests on therewrite.exampledomain are rewritten to thewww.example.comhost.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-rewrite namespace: httpbin spec: parentRefs: - name: agentgateway-proxy namespace: agentgateway-system hostnames: - rewrite.example rules: - filters: - type: URLRewrite urlRewrite: hostname: "www.example.com" backendRefs: - name: httpbin port: 8000 EOFSetting Description spec.parentRefsThe name and namespace of the Gateway that serves this HTTPRoute. In this example, you use the agentgateway-proxygateway that was created as part of the get started guide.spec.rules.filters.typeThe type of filter that you want to apply to incoming requests. In this example, the URLRewritefilter is used.spec.rules.filters.urlRewrite.hostnameThe hostname that you want to rewrite requests to. spec.rules.backendRefsThe backend destination you want to forward traffic to. In this example, all traffic is forwarded to the httpbin app that you set up as part of the get started guide. -
Send a request to the httpbin app on the
rewrite.exampledomain. Verify that you get back a 200 HTTP response code and that you see theHost: www.example.comheader in your response.ℹ️The following request returns a 200 HTTP response code, because you set up an HTTPRoute for the httpbin app on thewww.example.comdomain as part of the getting started guide. If you chose a different domain for your example, make sure that you have an HTTPRoute that can be reached under the host you want to rewrite to.curl -vi http://$INGRESS_GW_ADDRESS:80/headers -H "host: rewrite.example:80"curl -vi localhost:8080/headers -H "host: rewrite.example"Example output:
... { "headers": { "Accept": [ "*/*" ], "Host": [ "www.example.com" ], "User-Agent": [ "curl/8.7.1" ] } }
External service host rewrites
-
Create an AgentgatewayBackend that represents your external service. The following example creates an AgentgatewayBackend for the
httpbin.orgdomain.kubectl apply -f- <<EOF apiVersion: agentgateway.dev/v1alpha1 kind: AgentgatewayBackend metadata: name: httpbin namespace: httpbin spec: static: host: httpbin.org port: 80 EOF -
Create an HTTPRoute resource that matches incoming traffic on the
external-rewrite.exampledomain and forwards traffic to the AgentgatewayBackend that you created. Because the AgentgatewayBackend expects a different domain, you use theURLRewritefilter to rewrite the hostname fromexternal-rewrite.exampletohttpbin.org.kubectl apply -f- <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: backend-rewrite namespace: httpbin spec: parentRefs: - name: agentgateway-proxy namespace: agentgateway-system hostnames: - external-rewrite.example rules: - filters: - type: URLRewrite urlRewrite: hostname: "httpbin.org" backendRefs: - name: httpbin kind: AgentgatewayBackend group: agentgateway.dev EOF -
Send a request to the
external-rewrite.exampledomain. Verify that you get back a 200 HTTP response code and that you see theHost: httpbin.orgheader in your response.curl -vi http://$INGRESS_GW_ADDRESS:80/headers -H "host: external-rewrite.example:80"curl -vi localhost:8080/headers -H "host: external-rewrite.example"Example output:
* Request completely sent off < HTTP/1.1 200 OK HTTP/1.1 200 OK < content-type: application/json content-type: application/json < content-length: 268 content-length: 268 < server: envoy server: envoy < access-control-allow-origin: * access-control-allow-origin: * < access-control-allow-credentials: true access-control-allow-credentials: true < x-envoy-upstream-service-time: 2416 x-envoy-upstream-service-time: 2416 < { "headers": { "Accept": "*/*", "Host": "httpbin.org", "User-Agent": "curl/8.7.1" } }
Cleanup
You can remove the resources that you created in this guide.kubectl delete httproute httpbin-rewrite -n httpbin
kubectl delete httproute backend-rewrite -n httpbin
kubectl delete AgentgatewayBackend httpbin -n httpbin