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
相关产品推荐
相关产品推荐

