由于不区分大小写的URL和默认值,我如何避免ASP.NET MVC中的重复内容?

编辑 :现在我需要真正解决这个问题,我做了一些调查,并想出了一些减少重复内容的东西。 我在我的博客上发布了详细的代码示例: 使用ASP.NET MVC减少重复内容

第一篇文章 – 如果我标记错误或标记错误,请轻松一下:P

在Microsoft的新ASP.NET MVC框架中,似乎有两件事可能导致您的内容在多个URL上提供(Google会惩罚这些内容并导致您的PageRank在其中分割):

  • 不区分大小写的URL
  • 默认url

您可以设置默认控制器/操作以满足对域根目录的请求。 假设我们选择HomeController / Index。 我们最终提供以下提供相同内容的url:

  • mydomain.com/
  • mydomain.com/Home/Index

现在,如果人们开始链接到这两者,那么PageRank将被拆分。 谷歌也会认为它是重复的内容,并惩罚其中一个内容,以避免其结果重复。

除此之外,URL不区分大小写,因此我们实际上也为这些URL获取了相同的内容:

  • mydomain.com/Home/Index
  • mydomain.com/home/index
  • mydomain.com/Home/index
  • mydomain.com/home/Index
  • (列表还在继续)

所以,问题是……我如何避免这些处罚? 我想要:

  • 所有将默认操作的请求重定向(301状态)到同一个URL
  • 所有URL都区分大小写

可能?

扑通!

MVC 5现在支持仅生成小写URL和常见的尾随斜杠策略。

public static void RegisterRoutes(RouteCollection routes) { routes.LowercaseUrls = true; routes.AppendTrailingSlash = false; } 

另外在我的应用程序上,以避免在不同的域/ IP / Lettershell等重复内容…

http://yourdomain.com/en

https://yourClientIdAt.YourHostingPacket.com/

我倾向于基于PrimaryDomainProtocolControllerLanguageAction生成Canonical Urls

 public static String GetCanonicalUrl(RouteData route,String host,string protocol) { //These rely on the convention that all your links will be lowercase! string actionName = route.Values["action"].ToString().ToLower(); string controllerName = route.Values["controller"].ToString().ToLower(); //If your app is multilanguage and your route contains a language parameter then lowercase it also to prevent EN/en/ etc.... //string language = route.Values["language"].ToString().ToLower(); return String.Format("{0}://{1}/{2}/{3}/{4}", protocol, host, language, controllerName, actionName); } 

然后,如果当前请求url与之匹配,您可以使用@Gabe Sumner的答案重定向到您的操作的规范url。

我也在研究这个问题。 我显然会顺从ScottGu。 我谦卑地提供了解决这个问题的方法。

将以下代码添加到global.asax

 protected void Application_BeginRequest(Object sender, EventArgs e) { // If upper case letters are found in the URL, redirect to lower case URL. if (Regex.IsMatch(HttpContext.Current.Request.Url.ToString(), @"[AZ]") == true) { string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower(); Response.Clear(); Response.Status = "301 Moved Permanently"; Response.AddHeader("Location",LowercaseURL); Response.End(); } } 

一个很好的问题!

除了在这里发帖,我还通过电子邮件向ScottGu发送电子邮件,看他是否有好的回复。 他给出了一个为路由添加约束的示例,因此您只能响应小写url:

 public class LowercaseConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { string value = (string)values[parameterName]; return Equals(value, value.ToLower()); } 

并且在寄存器路由方法中:

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "home", action = "index", id = "" }, new { controller = new LowercaseConstraint(), action = new LowercaseConstraint() } ); } 

这是一个开始,但是我希望能够从Html.ActionLink和RedirectToAction等方法更改链接的生成以匹配。

我相信有更好的答案。 如果您在页面中放置规范链接,请执行以下操作:

  

然后谷歌只显示他们的结果中的规范页面,更重要的是所有的谷歌善良进入该页面,没有任何惩罚。

和你一样, 我有同样的问题 ; 除了我不愿满足于全小写的URL限制,并且不喜欢canonical方法(好吧,它很好,但不是单独的)。

我找不到解决方案,所以我们编写并开源了一个重定向类 。

使用它很容易:控制器类中的每个GET方法都需要在开始时添加这一行:

 Seo.SeoRedirect(this); 

SEO重写类自动使用C#5.0的Caller Info属性来完成繁重的工作,使上面的代码严格复制和粘贴。

正如我在链接的SO Q&A中提到的那样,我正在努力将其转换为属性,但是现在,它完成了工作。

该代码将强制一个URL的案例。 该案例将与控制器方法的名称相同 – 您可以选择是否要全部大写,全部更低,或两者兼而有(CamelCase适用于URL)。 它将针对不区分大小写的匹配发出301重定向,并将结果缓存在内存中以获得最佳性能。 它还将重定向尾随反斜杠(强制执行索引列表,否则强制执行)并删除通过默认方法名称(库存ASP.NET MVC应用程序中的Index )访问的重复内容。

我真的不知道你8年后的感受,但是现在ASP MVC 5支持属性路由以便于记住路由并解决SEO友好站点的重复内容问题

只需添加routes.MapMvcAttributeRoutes(); 在您的RouteConfig中,然后为每个操作定义一个且唯一的路由

  [Route("~/")] public ActionResult Index(int? page) { var query = from p in db.Posts orderby p.post_date descending select p; var pageNumber = page ?? 1; ViewData["Posts"] = query.ToPagedList(pageNumber, 7); return View(); } [Route("about")] public ActionResult About() { return View(); } [Route("contact")] public ActionResult Contact() { return View(); } [Route("team")] public ActionResult Team() { return View(); } [Route("services")] public ActionResult Services() { return View(); } 

基于Gabe Sumner的答案,但没有重定向JS,图像和其他内容。 仅适用于控制器操作。 我们的想法是在我们已经知道它的路线时在管道中稍后进行重定向。 为此,我们可以使用ActionFilter。

 public class RedirectFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var url = filterContext.HttpContext.Request.Url; var urlWithoutQuery = url.GetLeftPart(UriPartial.Path); if (Regex.IsMatch(urlWithoutQuery, @"[AZ]")) { string lowercaseURL = urlWithoutQuery.ToString().ToLower() + url.Query; filterContext.Result = new RedirectResult(lowercaseURL, permanent: true); } base.OnActionExecuting(filterContext); } } 

请注意,上面的filter不会重定向或更改查询字符串的大小写。

然后将ActionFilter全局绑定到所有操作,方法是将其添加到GlobalFilterCollection。

 filters.Add(new RedirectFilterAttribute()); 

在RouteCollection上仍然将LowercaseUrls属性设置为true是个好主意。