使用 C# MVC .NET 4.5 和我的 RouteConfig.cs
设置来附加尾部斜杠并将 URL 转换为小写:
routes.AppendTrailingSlash = true;
routes.LowercaseUrls = true;
我的 View 的 HTML 中有以下规范的 link
标记:
<link rel="canonical" href="@Url.Action("Index", Html.GetTitleType(Model.TitleType), new { i = Model.Title.Title_Id }, Request.Url.Scheme)" />
这很好用,但需要一些修改。我首选的规范 URL 结构是 "http://www.example.com/something/1234/"
- 如果我浏览的是 "http://example.com 网站"
那么呈现的规范链接是 "http://example.com/something/1234/"
这完全违背了目的。无论如何,如何确保规范标签包含 "http://www"
?显然,我可以自己对 URL 结构进行硬编码,但更喜欢更优雅的解决方案。
更新:我能想到的最好的办法是:
<link rel="canonical" href="@string.Format("{0}{1}", "http://www.example.com", @Url.Action("Index", Html.GetTitleType(Model.TitleType), new { i = Model.Title.Title_Id }))" />
"http://www.example.com"
也可以作为键值对存储在 web.config
中,最终结果如下所示:
<link rel="canonical" href="@string.Format("{0}{1}", @System.Web.Configuration.WebConfigurationManager.AppSettings["canonical_root_URL"], @Url.Action("Index", Html.GetTitleType(Model.TitleType), new { i = Model.Title.Title_Id }))" />
最佳答案
您提供的答案:
<link rel="canonical" href="@string.Format("{0}{1}", @System.Web.Configuration.WebConfigurationManager.AppSettings["canonical_root_URL"], @Url.Action("Index", Html.GetTitleType(Model.TitleType), new { i = Model.Title.Title_Id }))" />
...可以正常工作,因为它可以匹配 http://example.com/something/1234
、www.example.com/something/1234
等场景>、http://example.com/something/1234?randomVar=5
等到 http://www.example.com/something/1234/
。
然而,这是解决一个会产生其他问题的问题的一个很好的例子。 Patrick Hofman 和 Jeow Li Huan 的评论是正确的 - 您已经解决了规范性问题,但现在您必须处理 example.com
和 www.example.com
生成自己的因此,选择一个方案并通过在与另一个方案匹配的 URL 上执行永久 URL 重定向 ( HTTP 301
) 来坚持该方案。然后您将能够使用您的原始代码:
<link rel="canonical" href="@Url.Action("Index", Html.GetTitleType(Model.TitleType), new { i = Model.Title.Title_Id }, Request.Url.Scheme)" />
...没有问题,因为由于您在其他方案上强制执行的 HTTP 301
,Request.Url.Scheme
将始终相同。
关于c# - 确保 "www"始终包含在 MVC 内置帮助程序生成的链接中,以确保规范性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178960/