c# - 确保 "www"始终包含在 MVC 内置帮助程序生成的链接中,以确保规范性

标签 c# asp.net-mvc asp.net-mvc-4 canonical-link

使用 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/1234www.example.com/something/1234 等场景>、http://example.com/something/1234?randomVar=5 等到 http://www.example.com/something/1234/

然而,这是解决一个会产生其他问题的问题的一个很好的例子。 Patrick Hofman 和 Jeow Li Huan 的评论是正确的 - 您已经解决了规范性问题,但现在您必须处理 example.comwww.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 301Request.Url.Scheme 将始终相同。

关于c# - 确保 "www"始终包含在 MVC 内置帮助程序生成的链接中,以确保规范性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178960/

相关文章:

c# - 在自动执行 Controller 中的任何操作之前默认运行方法

javascript - 如何使用自动完成下拉列表中的按钮进一步过滤已显示的结果

asp.net - 可移植区域的缺点

asp.net-mvc - 在没有回发控制的情况下保留某些值的最安全方法是什么

asp.net - MVC 4 - View 'WebForm1.aspx' 必须派生自 ViewPage、ViewPage<TModel>、ViewUserControl 或 ViewUserControl<TModel>

c# - LINQ 执行多个查询而不是单个 "joined"查询

c# - "Possible multiple enumeration of IEnumerable"问题?

c# - 枚举到下拉列表 MVC3 C#

c# - 当多个单元测试复制同一个文件时,运行所有单元测试失败

c# - 使用 c# 从 Panasonic PBX 捕获数据