所以我知道如果你在多个网址上有相同的内容,谷歌可以惩罚一个网站...不幸的是,在MVC中这太常见了我可以example.com/
,example.com/Home/
和{{1}并且所有三个网址都会将我带到同一页面...所以如何在网址中example.com/Home/Index
时确保它在没有Index
的情况下重定向到同一页面,当然与Index
答案 0 :(得分:1)
也许this little library可能对您有用。 这个库在你的情况下不是很方便,但它应该可以工作。
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);
答案 1 :(得分:0)
我处理这个问题的方法是像Index这样的默认页面只为其中一个创建显式路由。即“example.com/People”将成为People / Index的路线,并且网址“/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()
{...
答案 2 :(得分:0)
所以我找到了一种没有任何外部库的方法......
在我的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
}
就是这样,现在我的网站看起来合法。我的网址中没有更多主页,没有更多索引,这当然有限制,无法接受Index
的任何Controllers
方法的参数,但如果真的有必要,你应该能够调整这个以达到你想要的效果。
只是一个FYI,如果你想将一个参数传递给你的Index Action,那么你可以像这样添加第三条路线:
routes.MapRoute(
name: "ContactUs",
url: "ContactUs/{id}/{action}",
defaults: new { controller = "ContactUs", action = "Index", id = UrlParameter.Optional }
);
这将创建一个这样的网址:/ContactUs/14