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

FastAPI应用部署K8s后Strict-Transport-Security响应头被覆盖问题

HSTS响应头在K8s部署后被篡改的问题排查

我基于Python(FastAPI)开发的应用已在代码中配置Strict-Transport-Security响应头:

application.add_middleware(HSTS, Option={'max-age': 31536000, 'includeSubDomains': True })

本地通过Postman测试时,返回的头值符合预期:max-age=31536000; includeSubDomains,但部署到Kubernetes服务器后,该头值被修改为max-age=15724800; includeSubDomains。

我的Ingress初始配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-body-size: "256m"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/ssl-protocols: "TLSv1.3"
name: api-dev-https
namespace: dev

我尝试过两种配置方案,但问题仍未解决:

方案1:通过server-snippets自定义HSTS规则

nginx.ingress.kubernetes.io/server-snippets: |
        proxy_hide_header Strict-Transport-Security;
          set $hsts_header_val "";
          if ($https = on) {
             set $hsts_header_val "max-age=31536000; includeSubDomains";
          }
          add_header Strict-Transport-Security "$hsts_header_val" always;

方案2:使用Nginx Ingress官方HSTS注解

nginx.ingress.kubernetes.io/hsts: "true"
nginx.ingress.kubernetes.io/hsts-max-age: "31536000"
nginx.ingress.kubernetes.io/hsts-include-subdomains: "true"

请问可能的原因是什么?


可能的原因分析

  • Ingress Controller全局配置覆盖:检查Nginx Ingress Controller的全局ConfigMap(通常命名为nginx-ingress-controller),若其中默认设置了hsts-max-age=15724800,全局配置会优先于单个Ingress资源上的注解。
  • 注解冲突:同时使用自定义server-snippets和官方HSTS注解会导致配置冲突,官方注解生成的Nginx配置可能覆盖了自定义snippet的规则。
  • Ingress资源未正确更新:修改Ingress配置后,需确认资源已重新部署生效。可执行kubectl apply -f <ingress配置文件>,或通过kubectl describe ingress api-dev-https -n dev查看注解是否已正确加载。
  • 前端负载均衡器干预:K8s集群前端若存在云厂商ALB/NLB等额外负载均衡设备,该设备可能自带HSTS配置,直接覆盖了Ingress返回的响应头。
  • Ingress Controller版本bug:部分旧版本的Nginx Ingress Controller在处理HSTS注解时存在逻辑问题,建议升级至最新稳定版本后重试。
  • proxy_hide_header未生效:自定义snippet中的proxy_hide_header可能未成功隐藏应用返回的HSTS头,导致响应中存在两个HSTS头,客户端优先读取了Ingress生成的旧值。可通过curl -I https://你的域名查看所有响应头,确认是否存在重复的Strict-Transport-Security字段。

内容的提问来源于stack exchange,提问作者rcs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:35:56