跳至内容

HTTP 路径重定向和重写

HTTPRoute 资源 可以使用 过滤器 向客户端发出重定向或重写上游发送的路径。本指南介绍了如何使用这些功能。

请注意,重定向和重写过滤器是相互不兼容的。规则不能同时使用两种过滤器类型。

重定向

重定向向客户端返回 HTTP 3XX 响应,指示它检索不同的资源。RequestRedirect 规则过滤器 指示网关向匹配过滤的 HTTPRoute 规则的请求发出重定向响应。

重定向过滤器可以独立替换各种 URL 组件。例如,要从 HTTP 到 HTTPS 发出永久重定向 (301),请配置 requestRedirect.statusCode=301requestRedirect.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
有多种方法可以保护网关。在此示例中,它是使用 Kubernetes 密钥 (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/pinchhttps://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/pinchlocation: 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: ReplacePrefixMatchreplacePrefixMatch: /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