Kubernetes NGINX Ingress配置TLS后POST请求被重定向为GET求助
问题分析
从Ingress Pod日志能看到,你的POST /auth/login请求被返回301重定向,随后客户端自动发送了GET /auth/login请求,但后端没有对应GET接口,因此返回404。
问题核心是:NGINX Ingress Controller默认将HTTP请求重定向到HTTPS时使用301永久重定向,而HTTP规范中301会把POST、PUT等非GET方法强制转换为GET方法,直接导致你的POST接口无法被正确访问。
解决方案
要解决这个问题,需要将重定向代码改为308永久重定向——308会严格保留原始请求的方法(比如POST),同时完成HTTP到HTTPS的强制跳转。
修改你的Ingress资源,添加对应的annotations:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster-issuer: letsencrypt-prod acme.cert-manager.io/http01-edit-in-place: "true" # 强制所有HTTP请求跳转至HTTPS nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # 指定重定向代码为308,保留原始请求方法 nginx.ingress.kubernetes.io/permanent-redirect-code: "308" name: api-dev-ingress spec: tls: - hosts: - api.dev secretName: letsencrypt-prod ingressClassName: nginx rules: - host: api.dev http: paths: - pathType: Prefix path: / backend: service: name: api-service-staging port: number: 80
验证修改
重新应用Ingress配置后,再次发送POST请求,日志应显示类似如下内容:
10.106.0.3 - - [12/Jul/2022:13:17:17 +0000] "POST /auth/login HTTP/1.1" 308 169 "-" "PostmanRuntime/7.29.0" "-" 10.106.0.3 - - [12/Jul/2022:13:17:17 +0000] "POST /auth/login HTTP/2.0" 200 "-" "PostmanRuntime/7.29.0" "-"
此时POST方法会被完整保留,后端能正常处理请求。
补充说明
force-ssl-redirect: "true":确保所有HTTP请求都被强制跳转至HTTPS,即使Ingress未配置TLS也会生效(你的场景已配置TLS,此配置可强化跳转逻辑)。permanent-redirect-code: "308":替代默认的301重定向,专门适配API场景,避免非GET请求被强制转换。
内容的提问来源于stack exchange,提问作者carlosza
相关产品推荐
相关产品推荐

