ASP.NET部署反向代理后Swashbuckle Swagger HTTP转HTTPS配置问题
问题根因
这是反向代理场景下Swagger生成文档地址误判协议的典型问题:你的后端服务实际运行在HTTP协议下,Swashbuckle默认会根据当前请求的实际协议生成swagger.json的访问地址,导致在HTTPS的代理入口访问时生成了HTTP地址,触发浏览器混合内容拦截。你之前配置的c.Schemes({"https"})仅用来指定Swagger页面测试接口时使用的协议,和swagger文档本身的访问地址无关,所以不会解决当前问题。
解决方法
方案1:固定指定HTTPS根地址(简单稳定,支持运行时修改)
在EnableSwagger配置块中添加RootUrl委托,强制指定swagger文档的根地址为HTTPS协议的公网域名即可。如果需要运行时修改,直接把公网域名配置到配置文件中动态读取即可,无需修改代码。
修改后的SwaggerConfig.vb核心代码如下:
GlobalConfiguration.Configuration.EnableSwagger( Function(c) ' 强制指定Swagger文档的根路径为HTTPS公网地址 c.RootUrl(Function(req) "https://external_public_name/api") ' 若要运行时可修改,改成从配置文件读取,示例: ' c.RootUrl(Function(req) ConfigurationManager.AppSettings("SwaggerRootUrl")) c.Schemes({"https"}) c.SingleApiVersion("v1", "api") c.DocumentFilter(Of KnownSubTypesDocumentFilter)() Return c End Function).EnableSwaggerUi( Function(ui) ui.DocumentTitle("Skippy's API") ui.DocExpansion(DocExpansion.List) ui.SupportedSubmitMethods() Return ui End Function)
如果选择从配置读取的方式,只需要在web.config的<appSettings>节点添加一行配置即可,后续改地址直接修改配置项即可:
<add key="SwaggerRootUrl" value="https://external_public_name/api" />
方案2:通过反向代理转发头动态判断(更灵活,无需写死域名)
如果你的上游反向代理支持转发X-Forwarded-Proto(请求实际协议)和X-Forwarded-Host(请求实际域名)头,可以直接通过请求头动态生成根地址,不需要写死任何配置,适配性更强:
c.RootUrl(Function(req) Dim proto = If(req.Headers.GetValues("X-Forwarded-Proto")?.FirstOrDefault(), "http") Dim host = If(req.Headers.GetValues("X-Forwarded-Host")?.FirstOrDefault(), req.RequestUri.Host) Return $"{proto}://{host}/api" End Function)
注意:如果你的项目使用的是低于VB 14的版本(对应.NET Framework 4.6以下),不支持$字符串插值语法,替换为
String.Format("{0}://{1}/api", proto, host)即可。
内容的提问来源于stack exchange,提问作者Skippy
相关产品推荐
相关产品推荐

