如何设置路由以便索引显示?

时间:2013-07-17 20:33:18

标签: c# .net asp.net-mvc-4 routing

所以我知道如果你在多个网址上有相同的内容,谷歌可以惩罚一个网站...不幸的是,在MVC中这太常见了我可以example.com/example.com/Home/和{{1}并且所有三个网址都会将我带到同一页面...所以如何在网址中example.com/Home/Index时确保它在没有Index的情况下重定向到同一页面,当然与Index

相同的事情

3 个答案:

答案 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