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

Swashbuckle生成API文档协议错误(HTTP替代HTTPS)排查求助

问题描述

我们的Web API部署在Azure Kubernetes集群中,使用Nginx作为Ingress控制器、Let's Encrypt实现HTTPS。测试命名空间(staging)一切正常:Swagger UI可通过HTTPS访问,服务器也显示HTTPS协议;但生产命名空间(prod)中,Swagger UI虽能通过HTTPS访问,但服务器仅显示HTTP协议,且调用任何API接口均失败。

已知信息:

  • Nginx与服务之间的通信仅为HTTP
  • 测试与生产环境使用的Docker镜像一致
  • 测试与生产环境的Ingress仅服务名称和主机名不同

请问Nginx向API服务传递协议信息时可能出现什么问题?

可能的问题及解决方向

1. Ingress配置缺失X-Forwarded-Proto头传递

Nginx Ingress不会默认自动将外部请求的真实协议(HTTPS)通过X-Forwarded-Proto头传递给后端服务。测试环境正常可能是因为其Ingress隐含了该配置,而生产环境遗漏了相关注解。

需要在生产环境Ingress资源中添加以下注解,确保协议头正确传递:

nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
nginx.ingress.kubernetes.io/x-forwarded-proto: "https"
nginx.ingress.kubernetes.io/ssl-redirect: "true"

同时要确认API服务已配置为读取X-Forwarded-Proto头,以此生成正确的HTTPS协议链接(比如Swagger中的接口地址)。

2. 生产环境Ingress的TLS配置异常

虽然Let's Encrypt签发了证书,但生产环境Ingress的TLS配置可能存在错误,导致Nginx无法正确识别外部HTTPS请求,进而未传递正确的协议头。检查生产环境Ingress的TLS段:

tls:
  - hosts:
      - 你的生产域名.com
    secretName: 你的生产TLS密钥名称

确认secretName对应的Secret存在且包含有效证书,同时主机名与证书域名完全匹配。

3. API服务的转发头信任配置不一致

即便Nginx传递了X-Forwarded-Proto头,若API服务未信任来自Nginx的该头,仍会判定请求为HTTP。比如在ASP.NET Core中,需配置ForwardedHeadersOptions信任Nginx的集群内部IP段:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    options.KnownProxies.Add(IPAddress.Parse("Nginx集群内部IP"));
});

测试环境正常但生产环境异常,可能是生产环境Nginx的集群IP不同,或者服务的信任配置被意外修改。

4. Nginx Ingress控制器的全局配置差异

检查测试与生产环境的Nginx Ingress控制器ConfigMap,确认生产环境控制器未全局禁用转发头。若全局配置use-forwarded-headers为false,Ingress资源的注解将不生效。可通过以下命令查看控制器配置:

kubectl get configmap nginx-ingress-controller -n kube-system -o yaml

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:35:29