HTTP 路径重定向和重写¶
HTTPRoute 资源 可以使用 过滤器 向客户端发出重定向或重写上游发送的路径。本指南介绍了如何使用这些功能。
请注意,重定向和重写过滤器是相互不兼容的。规则不能同时使用两种过滤器类型。
重定向¶
重定向向客户端返回 HTTP 3XX 响应,指示它检索不同的资源。RequestRedirect
规则过滤器 指示网关向匹配过滤的 HTTPRoute 规则的请求发出重定向响应。
重定向过滤器可以独立替换各种 URL 组件。例如,要从 HTTP 到 HTTPS 发出永久重定向 (301),请配置 requestRedirect.statusCode=301
和 requestRedirect.scheme="https"
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-redirect
spec:
parentRefs:
- name: redirect-gateway
sectionName: http
hostnames:
- redirect.example
rules:
- filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
重定向更改配置的 URL 组件以匹配重定向配置,同时保留来自原始请求 URL 的其他组件。在此示例中,请求 GET http://redirect.example/cinnamon
将导致带有 location: https://redirect.example/cinnamon
标头的 301 响应。主机名 (redirect.example
)、路径 (/cinnamon
) 和端口 (隐式) 保持不变。
HTTP 到 HTTPS 重定向¶
要将 HTTP 流量重定向到 HTTPS,您需要一个具有 HTTP 和 HTTPS 侦听器的网关。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: redirect-gateway
spec:
gatewayClassName: foo-lb
listeners:
- name: http
protocol: HTTP
port: 80
- name: https
protocol: HTTPS
port: 443
tls:
mode: Terminate
certificateRefs:
- name: redirect-example
certificateRefs
部分中的 redirect-example
) 来保护的。
您需要一个附加到 HTTP 侦听器并执行重定向到 HTTPS 的 HTTPRoute。在这里,我们将 sectionName
设置为 http
,以便它只选择名为 http
的侦听器。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-redirect
spec:
parentRefs:
- name: redirect-gateway
sectionName: http
hostnames:
- redirect.example
rules:
- filters:
- type: RequestRedirect
requestRedirect:
scheme: https
statusCode: 301
您还需要一个附加到 HTTPS 侦听器并将 HTTPS 流量转发到应用程序后端的 HTTPRoute。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: https-route
labels:
gateway: redirect-gateway
spec:
parentRefs:
- name: redirect-gateway
sectionName: https
hostnames:
- redirect.example
rules:
- backendRefs:
- name: example-svc
port: 80
路径重定向¶
路径重定向使用 HTTP 路径修改器来替换整个路径或路径前缀。例如,下面的 HTTPRoute 将向所有以 /cayenne
开头的 redirect.example
请求发出 302 重定向到 /paprika
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-redirect
spec:
hostnames:
- redirect.example
rules:
- matches:
- path:
type: PathPrefix
value: /cayenne
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplaceFullPath
replaceFullPath: /paprika
statusCode: 302
对 https://redirect.example/cayenne/pinch
和 https://redirect.example/cayenne/teaspoon
的请求都将收到带有 location: https://redirect.example/paprika
的重定向。
另一种路径重定向类型 ReplacePrefixMatch
仅替换与 matches.path.value
匹配的路径部分。将上面的过滤器更改为
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-redirect
spec:
hostnames:
- redirect.example
rules:
- matches:
- path:
type: PathPrefix
value: /cayenne
filters:
- type: RequestRedirect
requestRedirect:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /paprika
statusCode: 302
将导致带有 location: https://redirect.example/paprika/pinch
和 location: https://redirect.example/paprika/teaspoon
响应标头的重定向。
重写¶
重写会在将客户端请求代理到上游之前修改其组件。URLRewrite
过滤器 可以更改上游请求主机名和/或路径。例如,以下 HTTPRoute 将接受对 https://rewrite.example/cardamom
的请求,并将它发送到上游的 example-svc
,请求标头中的 host: elsewhere.example
而不是 host: rewrite.example
。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-rewrite
spec:
hostnames:
- rewrite.example
rules:
- filters:
- type: URLRewrite
urlRewrite:
hostname: elsewhere.example
backendRefs:
- name: example-svc
weight: 1
port: 80
路径重写也使用 HTTP 路径修改器。下面的 HTTPRoute 将获取对 https://rewrite.example/cardamom/smidgen
的请求,并将对 https://elsewhere.example/fennel
的请求代理到上游的 example-svc
。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-rewrite
spec:
hostnames:
- rewrite.example
rules:
- matches:
- path:
type: PathPrefix
value: /cardamom
filters:
- type: URLRewrite
urlRewrite:
hostname: elsewhere.example
path:
type: ReplaceFullPath
replaceFullPath: /fennel
backendRefs:
- name: example-svc
weight: 1
port: 80
如果改用 type: ReplacePrefixMatch
和 replacePrefixMatch: /fennel
,则会向 https://elsewhere.example/fennel/smidgen
发出上游请求。
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: http-filter-rewrite
spec:
hostnames:
- rewrite.example
rules:
- matches:
- path:
type: PathPrefix
value: /cardamom
filters:
- type: URLRewrite
urlRewrite:
hostname: elsewhere.example
path:
type: ReplacePrefixMatch
replacePrefixMatch: /fennel
backendRefs:
- name: example-svc
weight: 1
port: 80