
# 为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连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用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.networking.k8s.io/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连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用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.networking.k8s.io/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连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用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.networking.k8s.io/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连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用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/force-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/force-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.networking.k8s.io/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}
   ```
   
   
 
