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
相关产品推荐
相关产品推荐

