ASP.NET Core 6 Razor Pages配置301重定向实现域名与HTTPS跳转
不需要在每个控制器单独做URL校验和强制跳转,通过全局自定义中间件即可统一实现符合SEO要求的301重定向规则。
你观察到的307状态码确实是app.UseHttpsRedirection()的默认行为:这个内置中间件默认返回307临时重定向,设计初衷是避免开发环境调试时重定向规则被浏览器永久缓存,本身不适合生产环境做永久跳转配置。
具体实现方式
- 删除原有
Program.cs中的app.UseHttpsRedirection();代码 - 在异常处理、HSTS配置之后,
app.UseStaticFiles()之前插入自定义重定向中间件,保证所有请求进入业务处理流程前先完成重定向判断。修改后的完整Program.cs核心逻辑参考如下:
//builder.Services.Configure<RouteOptions>(options => //{ // options.LowercaseUrls = true; // options.LowercaseQueryStrings = true; //}); builder.Services.AddRazorPages(options => { options.Conventions.AddPageRoute("/MyControll", "My-Page-Default"); }); builder.Services.AddReCaptcha(builder.Configuration.GetSection("ReCaptcha")); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } // 自定义301重定向中间件开始 app.Use(async (context, next) => { var request = context.Request; // 本地开发环境(localhost)跳过所有重定向,避免影响调试 if (request.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase)) { await next(); return; } var needRedirect = false; var targetScheme = request.Scheme; var targetHost = request.Host; // 处理HTTP到HTTPS的跳转 if (!request.IsHttps) { needRedirect = true; targetScheme = "https"; } // 处理不带www根域名到带www域名的跳转,替换为你自己的实际域名即可 if (request.Host.Host.Equals("example.com", StringComparison.OrdinalIgnoreCase)) { needRedirect = true; targetHost = new HostString("www.example.com"); } if (needRedirect) { // 拼接完整目标地址,保留原请求的路径、查询字符串,一次跳转完成两个规则 var targetUrl = UriHelper.BuildAbsolute( targetScheme, targetHost, request.PathBase, request.Path, request.QueryString); // 返回301永久重定向状态码 context.Response.StatusCode = StatusCodes.Status301MovedPermanently; context.Response.Headers.Location = targetUrl; return; } await next(); }); // 自定义301重定向中间件结束 app.UseStatusCodePagesWithReExecute("/Erro", "?statusCode={0}"); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
注意事项
- 上述实现会同时满足HTTP转HTTPS、不带www转www两个规则,符合条件的请求只会触发一次301跳转,不会产生多次重定向分散SEO权重
- 中间件顺序不能随意调整,必须放在
UseStaticFiles、UseRouting等处理具体请求的中间件之前,否则静态资源、部分页面请求会绕过重定向逻辑 - 301重定向会被浏览器、搜索引擎长期缓存,正式上线前可以先把状态码临时改成
StatusCodes.Status302Found做测试,确认所有跳转规则正确后再换回301,避免错误规则被缓存导致站点无法正常访问 - 如果你有多个二级域名不需要加www,不要用“检测Host是否以www开头否则自动加www”的通用逻辑,直接指定需要跳转的根域名做匹配即可,避免二级域名被错误跳转
内容的提问来源于stack exchange,提问作者MariINova
相关产品推荐
相关产品推荐

