确保“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 }))" />
您提供的答案:
<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
生成自己的一组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)。