我如何可以避免重复内容ASP.NET 视由于情况不敏感的网址和默认值?
-
05-07-2019 - |
题
编辑:现在我需要解决这个问题,真的,我做了一点小小的更多 调查并提出了一个 许多事情,以减少重复 内容。我发布详细的代码 试样在我的博客: 减少 重复内容ASP.NET 视
第一篇-去很容易,如果我已经标明这是错误的或标记它严重:P
在微软新的ASP.NET 视的框架似乎有两个东西,可能会导致您的内容提供了至多个网址(东西谷歌惩罚,并将导致Pr分在它们之间):
- 情况不敏感的网址
- 默认的URL
你可以设定缺省控制器/操作服务的请求的根源您的领域。让我们说,我们选择HomeController/索引。我们结束了以下网址提供同样的内容:
- mydomain.com/
- mydomain.com/Home/Index
现在,如果人们开始链接到这两个然后Pr会分裂。谷歌还将考虑它重复的内容和惩罚他们中的一个,以避免重复,在它们的结果。
在此之上,网址是不敏感,所以我们实际上获得相同的内容为这些网址:
- mydomain.com/Home/Index
- mydomain.com/home/index
- mydomain.com/Home/index
- mydomain.com/home/Index
- (名单上)
因此,问题...我该如何避免这些惩罚?我想:
- 所有请求于默认的行动重新定向(301状态)以同一网址
- 所有网址是情况的敏感
可能吗?
解决方案
撞!
视5 现在支持生产只小写的网址和公共后削减的政策。
public static void RegisterRoutes(RouteCollection routes)
{
routes.LowercaseUrls = true;
routes.AppendTrailingSlash = false;
}
还在我的应用程序,以避免重复的内容在不同的领域/Ip/信壳等。
我倾向于产生规范网址的基础上 PrimaryDomain - 协议 - 控制器 - 语言 - 动作
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请求不匹配。
其他提示
我是在这方面的工作。我显然将推迟到ScottGu这一点。我谦恭地提供我解决这个问题,以及虽然。
添加以下代码 全球性的。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(), @"[A-Z]") == true)
{
string LowercaseURL = HttpContext.Current.Request.Url.ToString().ToLower();
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location",LowercaseURL);
Response.End();
}
}
一个很大的问题!
以及张贴在这里,我通过电子邮件ScottGu看如果他有一个很好的响应。他给了一个样品对于增加限制的路线,所以你只能应对小写的网址:
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() }
);
}
它是一个开始,但'd希望能够改变产生的链接的方法,如Html。ActionLink和RedirectToAction相匹配。
我相信有一个更好的答案。如果你把一个规范链接在你的页头,如:
<link rel="canonical" href="http://mydomain.com/Home/Index"/>
然后谷歌只能显示规范的页面在它们的结果更重要的是所有谷歌善进入该网页没有惩罚。
喜欢你, 我有同样的问题;除了我不愿意解决对于所有小写的URL限制,和没有喜欢的 canonical
办法要么(嗯,这是很好的但并不在其自己的)。
我不能找到一个解决方案,因此我们 写和开放源 一个 重定向类.
使用很容易的:每一个获取方法在控制器类需要添加这一条线路在开始:
Seo.SeoRedirect(this);
SEO改写类自动使用C#5.0的呼叫者的信息属性做繁重,使上述代码严格复制和粘贴。
正如我提到的链接,使问,我工作上的方式得到这个转变为一个属性,但现在,它得到完成工作。
代码将军一案例的网址。案件将姓名相同的控制器的方法-你的选择如果你想要所有的帽子,所有较低,或两者的混合(驼峰式是很好的Url).它会问题301重定向的情况不敏感的匹配,并缓存的结果在存储器中的最佳业绩。它还会重新定向后的反斜杠(强制索引目录、强迫关闭,否则)以及删除重复的内容,可通过默认的方法名称(Index
在一个股票ASP.NET 软应用程序).
我真的不知道你如何感觉之后8年,但现在ASP视5支持特性的路由,容易记住的路线和要解决的重复内容的问题对于搜索引擎友好点
只是添加 路线。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();
}
基于答案来自加布萨姆纳,但没有重定向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, @"[A-Z]"))
{
string lowercaseURL = urlWithoutQuery.ToString().ToLower() + url.Query;
filterContext.Result = new RedirectResult(lowercaseURL, permanent: true);
}
base.OnActionExecuting(filterContext);
}
}
注意,该过滤器上没有重定向或改变壳体,用于查询串。
然后结合ActionFilter在全球范围内的所有行动,通过增加到GlobalFilterCollection.
filters.Add(new RedirectFilterAttribute());
这是一个很好的想法仍然设置的LowercaseUrls财产的真正的RouteCollection.