ASP.NET MVC 5中如何将/Home/AGM重定向至简洁URL /agm并更新地址栏
解决ASP.NET MVC 5旧URL自动重定向到新简洁URL的问题
好的,这个需求很合理——你已经搞定了新的短URL访问,现在就差让旧的/Home/AGM自动跳转到/agm,同时更新地址栏对吧?这里有两个实用的方案,你可以根据项目情况选择:
方案1:自定义Action过滤器(推荐,解耦业务逻辑)
这个方法不用改动原有的AGM动作方法代码,而是通过过滤器来处理重定向逻辑,更符合MVC的设计思想。
首先创建一个自定义过滤器类:
using System.Web.Mvc; public class RedirectToCanonicalUrlAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var request = filterContext.HttpContext.Request; // 检查当前请求的URL是否是旧的格式 if (request.Url.AbsolutePath.Equals("/Home/AGM", System.StringComparison.OrdinalIgnoreCase)) { // 用301永久重定向(对SEO友好,搜索引擎会更新索引) filterContext.Result = new RedirectResult("/agm", permanent: true); } base.OnActionExecuting(filterContext); } }
然后把这个过滤器应用到HomeController的AGM方法上:
public class HomeController : Controller { [RedirectToCanonicalUrl] public ActionResult AGM() { // 原有的业务逻辑保持不变 return View(); } }
如果你的项目里还有其他类似需要重定向的Action,也可以把这个过滤器注册为全局过滤器,这样就不用逐个方法加特性了:
打开App_Start/FilterConfig.cs,添加:
filters.Add(new RedirectToCanonicalUrlAttribute());
方案2:直接在Action方法内添加重定向逻辑
如果你的场景很简单,不想额外创建过滤器,也可以直接在AGM方法里处理:
public ActionResult AGM() { var request = Request; // 判断当前请求的路径是否是旧URL if (request.Url.AbsolutePath.Equals("/Home/AGM", System.StringComparison.OrdinalIgnoreCase)) { // 301永久重定向到新URL return RedirectPermanent("/agm"); } // 原有的业务逻辑 return View(); }
重要提醒:路由顺序要正确
你已经配置了新的AGM路由,但一定要确保它在默认路由之前,否则请求会先匹配到默认路由,影响重定向效果:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // 新的AGM路由要放在默认路由前面 routes.MapRoute( name: "AGM", url: "agm", defaults: new { controller = "Home", action = "AGM" } ); // 默认路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
为什么用301重定向?因为这是永久重定向,搜索引擎会把旧URL的权重转移到新URL上,用户的旧书签也会逐步被搜索引擎更新,对SEO和用户体验都更友好。
内容的提问来源于stack exchange,提问作者Brendan Vogt
相关产品推荐
相关产品推荐

