Blazor/IIS环境下HTTP强制跳转HTTPS失效,非HTTPS链接报404
问题描述
部署在IIS上的Blazor应用遇到以下问题:所有未显式使用HTTPS的链接返回404错误,无法自动重定向到HTTPS。
示例:
app.domain.com -> 404 http://app.domain.com -> 404 https://app.domain.com -> 访问成功
已尝试的解决方案
- 配置IIS URL Rewrite规则,实现HTTP转HTTPS的重定向逻辑
- 在IIS站点设置中取消并重新勾选“要求SSL”选项
- 修改web.config中的重定向URL为硬编码域名格式:
url="https://app.domain.com/{R:1}",替代原有的url="https://{HTTP_HOST}{REQUEST_URI}" - 在Program.cs中添加
app.UseHttpsRedirection();,并配置HTTPS重定向参数:builder.Services.AddHttpsRedirection(options => { options.RedirectStatusCode = (int)HttpStatusCode.PermanentRedirect; options.HttpsPort = 443; });
当前代码
web.config重写规则
<rewrite> <rules> <rule name="Redirect HTTP to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" redirectType="SeeOther" /> </rule> </rules> </rewrite>
Program.cs代码
// <<<< BUILDER.SERVICES.ADDSINGLETON... >>>> builder.Services.AddResponseCompression(o => { o.EnableForHttps = true; o.Providers.Add<BrotliCompressionProvider>(); o.Providers.Add<GzipCompressionProvider>(); o.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( new[] { "image/svg+xml" }); }); builder.Services.Configure<BrotliCompressionProviderOptions>(options => { options.Level = CompressionLevel.Optimal; }); builder.Services.Configure<GzipCompressionProviderOptions>(options => { options.Level = CompressionLevel.Optimal; }); var app = builder.Build(); // <<<< APP.SERVICES.GetRequiredService... >>>> // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment() && !app.Environment.IsStaging()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); if(!app.Environment.IsProduction()) { StaticWebAssetsLoader.UseStaticWebAssets(app.Environment, app.Configuration); } app.UseRouting(); app.UseResponseCompression(); app.MapBlazorHub(); app.MapFallbackToPage("/_Host"); app.Run();
内容的提问来源于stack exchange,提问作者Joey C
相关产品推荐
相关产品推荐

