You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:45:39