したがって、複数の URL に同じコンテンツがある場合、Google がサイトにペナルティを課す可能性があることはわかっています...残念ながら、MVC ではこれはあまりにも一般的example.com/
でexample.com/Home/
ありexample.com/Home/Index
、3 つの 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);
これを処理する方法は、Index のような既定のページに対して、そのうちの 1 つだけに明示的なルートを作成するだけです。つまり、「example.com/People」は People/Index のルートとなり、URL「/example.com/People/Index」には有効なページがありません。
Home の例は、3 つの異なる URL を持つ可能性があるという点で独特です。この場合も、その Index アクションの「example.com」へのルートを作成するだけで、他の 2 つの URL はサポートしません。つまり、他の形式の URL にリンクすることは決してないため、それらがなくても問題が発生することはありません。
これをサポートするために、AttributeRouting と呼ばれる Nuget パッケージを使用します。ページの GET ルートを指定すると、MVC のデフォルトが上書きされます。
通常は AttributeRouting を使用してインデックスをマップします[GET("")]
が、コントローラー名を省略したルート URL もサポートしたい Home の特別なケースでは、IsAbsoluteUrl で追加の属性も追加すると思います。
public class HomeController : BaseController
{
[GET("")]
[GET("", IsAbsoluteUrl = true)]
public ActionResult Index()
{...
だから私は外部ライブラリなしでそれを行う方法を見つけました...
私のRouteConfig
場合、これらの 2 つのルートを上部のすぐ下に追加する必要がありました。IgnoreRoute
routes.MapRoute(
"Root",
"Home/",
new { controller = "Redirect", action = "Home" }
);
routes.MapRoute(
"Index",
"{action}/Index",
new { controller = "Redirect", action = "Home" }
);
次に、新しくController
呼び出されたものを作成する必要があり、次のように他の各 s の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
が、本当に必要な場合は、これを微調整して目的を達成できるはずです。 .
参考までに、インデックス アクションに引数を渡したい場合は、次のように 3 番目のルートを追加できます。
routes.MapRoute(
name: "ContactUs",
url: "ContactUs/{id}/{action}",
defaults: new { controller = "ContactUs", action = "Index", id = UrlParameter.Optional }
);
これにより、次のような URL が作成されます。/ContactUs/14