HTTPS部署的ASP.NET Core站点AJAX请求本地HTTP地址被转HTTPS如何解决
本质是HTTPS站点的**混合内容策略(Mixed Content)**限制,主流浏览器默认会把HTTPS页面下发起的主动HTTP请求自动升级为HTTPS,部分场景还会因为站点配置了HSTS(HTTP严格传输安全)强制所有请求走HTTPS,才会出现你遇到的协议被强制转换的问题。
方案1:ASP.NET Core后端做请求代理(最推荐,无兼容性问题)
无需修改浏览器配置、也无需改动局域网设备,在自己的ASP.NET Core服务内新增代理接口,前端页面请求自身站点的HTTPS接口,由后端服务转发请求到局域网HTTP设备,再把结果返回给前端即可。
可借助ASP.NET Core自带的IHttpClientFactory实现,参考代码:[ApiController] [Route("proxy")] public class DeviceProxyController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public DeviceProxyController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpGet] public async Task<IActionResult> Forward([FromQuery] string devicePath) { var client = _httpClientFactory.CreateClient(); // 拼接设备实际HTTP请求地址 var targetUrl = $"http://192.168.1.30/{devicePath.TrimStart('/')}"; var response = await client.GetAsync(targetUrl); var responseContent = await response.Content.ReadAsStringAsync(); return Content(responseContent, response.Content.Headers.ContentType?.ToString() ?? "text/plain"); } }前端直接请求
/proxy?devicePath=hello-world即可,同时天然避开跨域问题。方案2:浏览器侧配置豁免(仅适合内部小范围使用场景)
如果你的Web应用仅内部少量用户使用,可让用户手动修改浏览器配置,禁止浏览器对当前站点的HTTP请求做自动升级:
以Chrome为例,访问chrome://settings/content/insecureContent,在「允许向不安全网站发送请求」列表中添加你的HTTPS站点域名即可生效。方案3:给局域网设备加HTTPS反向代理
在设备所在局域网内部署Nginx做反向代理,给代理服务配置自签名证书或者你站点域名的子域名证书,前端直接请求该代理的HTTPS地址,由Nginx转发到设备的HTTP接口即可。方案4:修改站点响应头禁用自动升级(仅对未开启HSTS的站点生效)
在ASP.NET Core的响应头中添加Upgrade-Insecure-Requests: 0,通知浏览器不要自动升级当前页面发起的HTTP请求。如果你的站点已经开启了HSTS,需要先清除浏览器的HSTS缓存才会生效。
配置参考(Program.cs中添加):app.Use(async (context, next) => { context.Response.Headers["Upgrade-Insecure-Requests"] = "0"; await next(); });
内容的提问来源于stack exchange,提问作者Cal

