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

ASP.NET Core MVC 2021 如何实现强制SEO的URL重定向与重写?

可落地实现方案

ASP.NET Core自带URL Rewrite Middleware可以完美满足你列出的4项SEO需求,不需要从零编写自定义中间件逻辑,配置后全局强制生效,比单纯配置LowercaseUrls这类路由选项效果更可靠。

第一步:添加SEO重写规则类

创建SeoRedirectRules.cs文件,代码如下:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Rewrite;
using System;

public class SeoRedirectRules : IRule
{
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var response = context.HttpContext.Response;

        // 跳过本地开发环境校验,不需要可删除本段
        if (request.Host.Host.Equals("localhost", StringComparison.OrdinalIgnoreCase))
        {
            context.Result = RuleResult.ContinueRules;
            return;
        }

        bool isRewriteNeeded = false;
        var scheme = request.Scheme;
        var host = request.Host.Host;
        var path = request.Path.ToString();
        var queryString = request.QueryString.ToString();

        // 1. HTTP重定向到HTTPS
        if (!scheme.Equals("https", StringComparison.OrdinalIgnoreCase))
        {
            scheme = "https";
            isRewriteNeeded = true;
        }

        // 2. 非www域名重定向到www,若需要www跳非www修改本段逻辑即可
        if (!host.StartsWith("www.", StringComparison.OrdinalIgnoreCase))
        {
            host = "www." + host;
            isRewriteNeeded = true;
        }

        // 3. URL转为全小写
        var lowerPath = path.ToLowerInvariant();
        if (!lowerPath.Equals(path, StringComparison.Ordinal))
        {
            path = lowerPath;
            isRewriteNeeded = true;
        }

        // 4. 移除URL末尾斜杠,根路径/除外
        if (path.Length > 1 && path.EndsWith("/", StringComparison.OrdinalIgnoreCase))
        {
            path = path.TrimEnd('/');
            isRewriteNeeded = true;
        }

        // 触发重定向,使用301永久重定向更符合SEO规范
        if (isRewriteNeeded)
        {
            var newUrl = $"{scheme}://{host}{path}{queryString}";
            response.StatusCode = StatusCodes.Status301MovedPermanently;
            response.Headers.Location = newUrl;
            context.Result = RuleResult.EndResponse;
            return;
        }

        context.Result = RuleResult.ContinueRules;
    }
}

第二步:修改Startup.cs注册中间件

将重写中间件放到请求管道的最开头,保证优先执行,修改后的Configure方法如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{          
    // 注册SEO重写规则,放在管道最前面
    var rewriteOptions = new RewriteOptions()
        .Add(new SeoRedirectRules());
    app.UseRewriter(rewriteOptions);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    // 原有的UseHttpsRedirection可以删除,重写规则已经处理了HTTP转HTTPS逻辑
    // app.UseHttpsRedirection();

    // CUSTOM redirect to 404 page not found
    app.Use(async (context, next) =>
    {
        await next();
        if (context.Response.StatusCode == 404)
        {
            context.Request.Path = "/404/";
            await next();
        }
    });

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

补充说明

  • 原有的services.AddRouting配置中的LowercaseUrls和AppendTrailingSlash可以删除,全局重写规则优先级更高
  • 静态资源请求也会受该规则约束,符合统一SEO规范
  • 若有特殊路径不需要重定向,可在规则开头添加对应判断跳过即可

内容的提问来源于stack exchange,提问作者Kevin Fream

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 05:27:03