だるろぐ

明日できることは、今日しない。

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

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

  • むかし、はてなブログを daruyanagi.jp で運営していた
  • はてなブログをサブドメインなしで運用するのは非推奨だったので、blog.daruyanagi.jp へ移した
  • 当然ながら大量のリンク切れが発生
  • これを解消するため、daruyanagi.jp にリダイレクト機能を組み込んでいた(ASP.NET Web Pages 製)
  • ASP.NET Web Pages 製 daruyanagi.jp を ASP.NET Core MVC 製にする過程で、リダイレクト機能を省略した

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}");
        }
    }
}

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