0

所以我知道如果你在多个 url 上有相同的内容,谷歌会惩罚一个网站......不幸的是,在 MVC 中这太常见了,我可以拥有example.com/example.com/Home/并且example.com/Home/Index所有三个 url 都会把我带到同一个页面......那怎么办我确保无论何时Index在 url 中,它都会重定向到相同的Index位置,当然与Home

4

3 回答 3

1

也许这个小图书馆可能对你有用。这个库在你的情况下不是很方便,但它应该可以工作。

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);
于 2013-07-17T20:54:57.453 回答
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
}

就是这样,现在我的网站看起来合法了。没有更多的主页,我的 URL 中没有更多的索引,这当然有不能接受任何Index方法的参数的限制,Controllers但如果确实有必要,你应该能够调整它以实现你想要的.

仅供参考,如果您想将参数传递给您的索引操作,那么您可以添加第三条路线,如下所示:

 routes.MapRoute(
            name: "ContactUs",
            url: "ContactUs/{id}/{action}",
            defaults: new { controller = "ContactUs", action = "Index", id = UrlParameter.Optional }
        );

这将创建一个这样的 URL:/ContactUs/14

于 2013-07-19T03:06:02.867 回答
0

对于像 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()
     {...
于 2013-07-17T20:40:28.633 回答