Blazor Server部署IIS新站点遇混合内容错误,求IIS配置排查方案
问题背景
已搭建一个Blazor Server API,通过自签名证书在本地IIS以HTTPS托管运行正常;但按相同流程新建第二个Blazor Server API及对应IIS站点时,出现混合内容错误。将新API发布至原有正常站点可正常运行,复制原有站点配置重建故障站点后问题依旧,确认问题出在新IIS站点配置上。控制台显示多个HTTP资源(图片、样式表、脚本)被拦截或自动升级,部分第三方HTTP资源(如mailcontrol.com的图片)虽能显示但仍报错。
具体排查步骤
检查并配置HTTP严格传输安全(HSTS)
旧站点可能已启用HSTS自动将HTTP请求升级为HTTPS,新站点缺失该配置。在站点的web.config中添加以下配置:<system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" /> </customHeaders> </httpProtocol> </system.webServer>配置URL重写规则强制HTTPS及资源升级
确保站点有URL重写规则将所有HTTP请求跳转到HTTPS,同时添加规则将第三方HTTP资源请求重写为HTTPS:<system.webServer> <rewrite> <rules> <!-- 强制HTTPS跳转 --> <rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> <!-- 重写第三方HTTP资源为HTTPS --> <rule name="Upgrade third-party HTTP resources" stopProcessing="false"> <match url=".*http://(.*)" /> <action type="Rewrite" url="https://{R:1}" /> </rule> </rules> </rewrite> </system.webServer>验证Blazor应用的资源引用配置
检查_Host.cshtml(Blazor Server)中的base标签是否使用HTTPS地址:<base href="https://transactions.oracle.local/" />同时确保应用内所有静态资源、第三方资源引用使用相对路径或HTTPS绝对路径,避免硬编码
http://开头的地址。检查IIS站点绑定与SSL设置
- 确认新站点仅绑定HTTPS,删除不必要的HTTP绑定;
- 进入站点的“SSL设置”,勾选“要求SSL”并设置客户端证书为“忽略”;
- 验证自签名证书已正确绑定到站点,且证书状态正常。
核对applicationHost.config的深层配置差异
对比新旧站点在applicationHost.config中的以下配置:- 应用程序池的.NET版本、托管管道模式是否一致;
- 站点是否启用了相同的IIS模块(如URL Rewrite、ASP.NET Core模块);
- 站点的自定义HTTP响应头是否完全一致,避免遗漏旧站点的安全头配置。
额外说明
针对日志中出现的第三方资源(如mailcontrol.com),即使浏览器会自动升级HTTP请求,部分资源仍可能被浏览器的混合内容策略拦截。最彻底的解决方式是确保应用中所有第三方资源引用直接使用HTTPS地址,配合IIS的重写规则作为兜底方案。
内容的提问来源于stack exchange,提问作者SkinnyPete63

