更新时间:2024-09-29 GMT+08:00

为Nginx Ingress配置重定向规则

配置永久重定向规则

如果您想将访问请求永久重定向至某个目标网址(状态码为301),您可以通过nginx.ingress.kubernetes.io/permanent-redirect注解进行配置。例如将所有内容永久重定向到www.example.com:

nginx.ingress.kubernetes.io/permanent-redirect: https://www.example.com

在Nginx Ingress中的配置如下:

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml
    1.23及以上版本集群
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/permanent-redirect: https://www.example.com
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  service:
                    name: <your_service_name>  #替换为您的目标服务名称
                    port:
                      number: <your_service_port>  #替换为您的目标服务端口
                property:
                  ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                pathType: ImplementationSpecific
      ingressClassName: nginx
    1.21及以下版本集群
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-test
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/permanent-redirect: https://www.example.com
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  serviceName: <your_service_name>  #替换为您的目标服务名称
                  servicePort: <your_service_port>  #替换为您的目标服务端口

  3. 创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

  4. 查看已创建的Ingress。

    kubectl get ingress

    回显如下,表示Ingress服务创建成功。

    NAME          CLASS   HOSTS     ADDRESS          PORTS   AGE
    ingress-test  nginx   *         121.**.**.**     80      10s

  5. 访问Ingress,其中${ELB_IP}为Nginx Ingress所绑定的ELB IP。

    curl -I ${ELB_IP}

    最终访问路径会被永久重定向至www.example.com。

    HTTP/1.1 301 Moved Permanently
    Date: Sat, 20 Jul 2024 07:55:49 GMT
    Content-Type: text/html
    Content-Length: 162
    Connection: keep-alive
    Location: https://www.example.com

配置永久重定向的返回状态码

配置永久重定向时,您可以通过nginx.ingress.kubernetes.io/permanent-redirect-code注解修改永久重定向的返回状态码。例如将永久重定向的状态码设置为308:

nginx.ingress.kubernetes.io/permanent-redirect-code: '308'

在Nginx Ingress中的配置如下:

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml
    1.23及以上版本集群
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/permanent-redirect: https://www.example.com
        nginx.ingress.kubernetes.io/permanent-redirect-code: '308'
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  service:
                    name: <your_service_name>  #替换为您的目标服务名称
                    port:
                      number: <your_service_port>  #替换为您的目标服务端口
                property:
                  ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                pathType: ImplementationSpecific
      ingressClassName: nginx
    1.21及以下版本集群
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-test
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/permanent-redirect: https://www.example.com
        nginx.ingress.kubernetes.io/permanent-redirect-code: '308'
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  serviceName: <your_service_name>  #替换为您的目标服务名称
                  servicePort: <your_service_port>  #替换为您的目标服务端口

  3. 创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

  4. 查看已创建的Ingress。

    kubectl get ingress

    回显如下,表示Ingress服务创建成功。

    NAME          CLASS   HOSTS     ADDRESS          PORTS   AGE
    ingress-test  nginx   *         121.**.**.**     80      10s

  5. 访问Ingress,其中${ELB_IP}为Nginx Ingress所绑定的ELB IP。

    curl -I ${ELB_IP}

    最终访问路径会被永久重定向至www.example.com,且状态码为308。

    HTTP/1.1 308 Moved Permanently
    Date: Sat, 20 Jul 2024 07:55:49 GMT
    Content-Type: text/html
    Content-Length: 162
    Connection: keep-alive
    Location: https://www.example.com

配置临时重定向规则

如果您想将访问请求临时重定向至某个目标网址(状态码为302),您可以通过nginx.ingress.kubernetes.io/temporal-redirect注解进行配置。例如将所有内容临时重定向到www.example.com:

nginx.ingress.kubernetes.io/temporal-redirect: https://www.example.com

在Nginx Ingress中的配置如下:

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml
    1.23及以上版本集群
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/temporal-redirect: https://www.example.com
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  service:
                    name: <your_service_name>  #替换为您的目标服务名称
                    port:
                      number: <your_service_port>  #替换为您的目标服务端口
                property:
                  ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                pathType: ImplementationSpecific
      ingressClassName: nginx
    1.21及以下版本集群
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-test
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/temporal-redirect: https://www.example.com
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  serviceName: <your_service_name>  #替换为您的目标服务名称
                  servicePort: <your_service_port>  #替换为您的目标服务端口

  3. 创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

  4. 查看已创建的Ingress。

    kubectl get ingress

    回显如下,表示Ingress服务创建成功。

    NAME          CLASS   HOSTS     ADDRESS          PORTS   AGE
    ingress-test  nginx   *         121.**.**.**     80      10s

  5. 访问Ingress,其中${ELB_IP}为Nginx Ingress所绑定的ELB IP。

    curl -I ${ELB_IP}

    最终访问路径会被临时重定向至www.example.com,且状态码为302。

    HTTP/1.1 302 Moved Temporarily
    Date: Sat, 20 Jul 2024 08:01:02 GMT
    Content-Type: text/html
    Content-Length: 138
    Connection: keep-alive
    Location: https://www.example.com

配置HTTP重定向到HTTPS

默认情况下,若Ingress使用了TLS,通过HTTP访问时,请求将会被重定向(状态码为308)到HTTPS。您可以通过nginx.ingress.kubernetes.io/ssl-redirect注解进行配置,对应的参数值可设置为“true”或“false”:

  • true:使用TLS证书时,将HTTP访问重定向至HTTPS(状态码为308)。
  • false:使用TLS证书时,禁止将HTTP访问重定向至HTTPS。

如果您在没有使用TLS证书的情况下需要强制重定向到HTTPS,您可以使用nginx.ingress.kubernetes.io/force-ssl-redirect: "true"注释实现。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml
    1.23及以上版本集群
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      namespace: default
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  service:
                    name: <your_service_name>  #替换为您的目标服务名称
                    port:
                      number: <your_service_port>  #替换为您的目标服务端口
                property:
                  ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
                pathType: ImplementationSpecific
      ingressClassName: nginx
    1.21及以下版本集群
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-test
      namespace: default
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    spec:
      rules:
        - host: ''
          http:
            paths:
              - path: /
                backend:
                  serviceName: <your_service_name>  #替换为您的目标服务名称
                  servicePort: <your_service_port>  #替换为您的目标服务端口

  3. 创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

  4. 查看已创建的Ingress。

    kubectl get ingress

    回显如下,表示Ingress服务创建成功。

    NAME          CLASS   HOSTS     ADDRESS          PORTS   AGE
    ingress-test  nginx   *         121.**.**.**     80      10s

  5. 访问Ingress,其中${ELB_IP}为Nginx Ingress所绑定的ELB IP。

    curl -I ${ELB_IP}

    最终访问路径会被重定向至HTTPS(状态码为308)。

    HTTP/1.1 308 Permanent Redirect
    Date: Sat, 20 Jul 2024 08:03:36 GMT
    Content-Type: text/html
    Content-Length: 164
    Connection: keep-alive
    Location: https://${ELB_IP}