所以我知道如果你在多个 url 上有相同的内容,谷歌会惩罚一个网站......不幸的是,在 MVC 中这太常见了,我可以拥有example.com/
,example.com/Home/
并且example.com/Home/Index
所有三个 url 都会把我带到同一个页面......那怎么办我确保无论何时Index
在 url 中,它都会重定向到相同的Index
位置,当然与Home
3 回答
也许这个小图书馆可能对你有用。这个库在你的情况下不是很方便,但它应该可以工作。
var route = routes.MapRoute(name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
routes.Redirect(r => r.MapRoute("home_index", "/home/index")).To(route);
routes.Redirect(r => r.MapRoute("home", "/home")).To(route);
所以我找到了一种不需要任何外部库的方法......
在我的RouteConfig
我必须在顶部添加这两条路线,就在下面IgnoreRoute
routes.MapRoute(
"Root",
"Home/",
new { controller = "Redirect", action = "Home" }
);
routes.MapRoute(
"Index",
"{action}/Index",
new { controller = "Redirect", action = "Home" }
);
然后我必须创建一个新的Controller
被调用Redirect
,并为我的其他每个创建一个方法,Controller
如下所示:
public class RedirectController : Controller
{
public ActionResult Home()
{
return RedirectPermanent("~/");
}
public ActionResult News()
{
return RedirectPermanent("~/News/");
}
public ActionResult ContactUs()
{
return RedirectPermanent("~/ContactUs/");
}
// A method for each of my Controllers
}
就是这样,现在我的网站看起来合法了。没有更多的主页,我的 URL 中没有更多的索引,这当然有不能接受任何Index
方法的参数的限制,Controllers
但如果确实有必要,你应该能够调整它以实现你想要的.
仅供参考,如果您想将参数传递给您的索引操作,那么您可以添加第三条路线,如下所示:
routes.MapRoute(
name: "ContactUs",
url: "ContactUs/{id}/{action}",
defaults: new { controller = "ContactUs", action = "Index", id = UrlParameter.Optional }
);
这将创建一个这样的 URL:/ContactUs/14
对于像 Index 这样的默认页面,我处理这个问题的方法是只为其中一个页面创建一个显式路由。即“example.com/People”将是 People/Index 的路由,并且在 url “/example.com/People/Index”处将没有有效页面。
Home 示例的独特之处在于它可能具有三个不同的 URL。同样在这种情况下,我只需为该索引操作创建“example.com”的路由,而不支持其他两个 url。换句话说,您永远不会链接到其他形式的 URL,因此它们的缺失绝不会导致问题。
我们使用一个名为 AttributeRouting 的 Nuget 包来支持这一点。当您为页面指定 GET 路由时,它会覆盖 MVC 的默认值。
使用 AttributeRouting 通常您会将索引映射到,[GET("")]
但对于 Home 的特殊情况,您还希望支持省略控制器名称的根 URL,我认为您还可以使用 IsAbsoluteUrl 添加一个附加属性:
public class HomeController : BaseController
{
[GET("")]
[GET("", IsAbsoluteUrl = true)]
public ActionResult Index()
{...