ASP.NET Core MVC:特定のリクエストを他のサイトにリダイレクトする

執筆日時:

6月末、事情があって急遽 daruyanagi.jp を ASP.NET Core MVC で書き直した。

blog.daruyanagi.jp

しかし、このとき daruyanagi.jp → blog.daruyanagi.jp へのリダイレクト機能を実装していなかった。

blog.daruyanagi.jp

blog.daruyanagi.jp

リンク先を読むのがめんどくさい人のために、事情をかいつまんでいうと、

Visual Studio 2017 Update 3 が正式版になれば、ASP.NET Web Pages のような機能が IDE 側でサポートされるという話を聞いたので、それを待ってから実装してもいいかなと思っていたのだけど、なかなかこない&ブログにリンク切れが多くて使いにくかったので、とりあえずやっつけの対策を施した。

まず、ルーティングの書き換え。今回は /entry だけを対策しておく(ほんとは他の URL にも対策を施さないといけないけれど、今回は一番困るやつだけ対策)。

// {Root}/startup.cs

app.UseMvc(routes => { routes.MapRoute( name: "entry", template: "entry/{*id}", defaults: new { controller = "Entry", action = "Index" });

routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });

ちゃんとコントローラーに処理が移っているみたい。“*(アスタリスク)”を付ければ、“/(スラッシュ)”も含めてマッチするみたいだね。

f:id:daruyanagi:20170717143025p:plain

あとは EntryController をちょちょいのちょいと書き換え。

// {Root}/Controllers/EntryController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace daruyanagi.Controllers
{
public class EntryController : Controller
{
// GET: /<controller>/
public IActionResult Index()
{
var url = HttpContext.Request.Path;

return Redirect($"http://blog.daruyanagi.jp{url}");
}
}
}

これでだいたいイケてるような気がする。