确保“www”始终包含在 MVC 内置帮助程序生成的规范性链接中

本文关键字:程序生成 帮助 内置 规范性 链接 MVC www 包含 确保 | 更新日期: 2023-09-27 18:32:27

使用 C# MVC .NET 4.5 并将我的RouteConfig.cs设置为附加尾随斜杠并将 URL 转换为小写:

routes.AppendTrailingSlash = true;
routes.LowercaseUrls = true;

我的视图的 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 }))" />

确保“www”始终包含在 MVC 内置帮助程序生成的规范性链接中

您提供的答案:

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

但是,这是解决产生其他问题的问题的一个很好的例子。Patrick Hofman和Jeow Li Huan的评论是正确的 - 你已经弄清楚了你的规范性问题,但现在你必须处理example.comwww.example.com生成自己的一组cookie等。因此,选择一个方案并通过对与另一种方案匹配的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将始终相同。

在 IIS 管理器中选择您的站点,然后单击绑定,添加主机名 example.com 的绑定(不带 www)。