You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6 Razor Pages配置301重定向实现域名与HTTPS跳转

不需要在每个控制器单独做URL校验和强制跳转,通过全局自定义中间件即可统一实现符合SEO要求的301重定向规则。

你观察到的307状态码确实是app.UseHttpsRedirection()的默认行为:这个内置中间件默认返回307临时重定向,设计初衷是避免开发环境调试时重定向规则被浏览器永久缓存,本身不适合生产环境做永久跳转配置。

具体实现方式

  1. 删除原有Program.cs中的app.UseHttpsRedirection();代码
  2. 在异常处理、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:36:26