ASP.NET Core で URL Rewrite する

Webサーバーである「Apache」や「IIS」には URL Rewrite 機能が付いています。
同様にASP.NET Coreでも、アプリケーションレベルとしてのURL Rewrite機能が実装がされています。

ということで、簡単にご紹介を。

準備

Visual Studio 2017を起動し以下のプロジェクトを作成します。

  • 「Visual C# .NET Core → ASP.NET Core Web アプリケーション(.NET Core)」

ここではプロジェクト名は「RewriteExampleCoreWeb」としました。

f:id:daigo-knowlbo:20170401011447p:plain

f:id:daigo-knowlbo:20170401011459p:plain

以下のNugetパッケージを追加します。

f:id:daigo-knowlbo:20170401011612p:plain

Startup.csにリライト設定を追加

Startup.cs(Startupクラス)のConfigureメソッドにURL Rewrite設定を追加します。
まずは以下の using を追加しておきましょう。

using Microsoft.AspNetCore.Rewrite;

URL Rewrite設定は、以下のように RewriteOptions(Microsoft.AspNetCore.Rewrite名前空間)オブジェクト を IApplicationBuilder(app) に UseRewriter() することで設定します。
ちなみに UseRewriter() は、Microsoft.AspNetCore.Rewrite.dllアセンブリ に実装された IApplicationBuilder の拡張メソッドです。

// Startupクラス抜粋
public void Configure(
  IApplicationBuilder app, 
  IHostingEnvironment env, 
  ILoggerFactory loggerFactory)
{
  // URL Rewrite設定の基本(以下は設定が空なので実質何も起こらない)
  var options = new RewriteOptions();
  app.UseRewriter(options);
}

上記では、具体的な URL Rewrite 設定は何も行われていません。
以下にいくつかの URL Rewrite 設定の方法を紹介します。

1.シンプルにRewrite設定を追加

シンプルにRewrite設定する例を以下に示します。

  var options = new RewriteOptions()
    .AddRewrite(@"simple-rewrite-rule/(\d+)", "Rewritten/simple?id=$1", true);
  app.UseRewriter(options);

AddRewrite()メソッドを利用します。 第1引数はソースURL(正規表現を利用可能)、第2引数はリライト先URL、第3引数はパターンにマッチしたら以降のリライト設定の評価をスキップするかです(後述しますが、Add~()設定定義はチェインして定義可能です)。

また、リライト先URLの受け口となるController/RewrittenController.csを以下のように実装します。

// Controller/RewrittenController.cs
using Microsoft.AspNetCore.Mvc;

namespace RewriteExampleCoreWeb.Controllers
{
  public class RewrittenController : Controller
  {
    [HttpGet]
    public IActionResult Simple(int id)
    {
      return Content(string.Format("called RewittenControlle.Simple({0})", id));
    }
  }
}
実行

ブラウザで「http://localhost:6048/simple-rewrite-rule/456」にアクセスすると以下の実行結果が得られます。

f:id:daigo-knowlbo:20170401021400p:plain

URLリライトが動作し、RewrittenController.Simple()が呼び出されたことがわかります。

2.Apache mod_rewrite設定を追加

Apachemod_rewrite 設定ファイルを利用することも可能です。

まず、設定ファイルを用意します。ここではプロジェクトルートに「apache_mod_rewrite.txt」というファイルを追加しました。
※txtファイルの置き場所に関するセキュリティ観点はここでは考慮しませんm(_ _)m

// apache_mod_rewrite.txt
RewriteRule ^/apache-mod-rules/(.*) /rewritten/ApacheMod?id=$1

次に RewriteOptions の AddApacheModRewrite()メソッド を呼出し、Apache mod rewrite設定ファイル「apache_mod_rewrite.txt」を読み込みます。
以下の実装のように「Add~()」メソッドはチェインして重ねて定義することができます。

  var options = new RewriteOptions()
    .AddRewrite(@"simple-rewrite-rule/(\d+)", "Rewritten/simple?id=$1", true)
    .AddApacheModRewrite(env.ContentRootFileProvider, "apache_mod_rewrite.txt");
  app.UseRewriter(options);

リライト先のコントローラには ApacheMod()メソッド を追加します。

// Controller/RewrittenController.cs
using Microsoft.AspNetCore.Mvc;

namespace RewriteExampleCoreWeb.Controllers
{
  public class RewrittenController : Controller
  {
    [HttpGet]
    public IActionResult ApacheMod(int id)
    {
      return Content(string.Format("called RewittenControlle.ApacheMod({0})", id));
    }

    ... 省略
  }
}
実行

ブラウザで「http://localhost:6048/apache-mod-rules/123」にアクセスすると以下の実行結果が得られます。

f:id:daigo-knowlbo:20170401022836p:plain

3.IIS Rewrite設定を追加

IISRewrite 設定ファイルを利用することも可能です。

まず、設定ファイルを用意します。ここではプロジェクトルートに「IISUrlRewrite.xml」というファイルを追加しました。

// IISUrlRewrite.xml
<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="Rewritten/IisRewrite?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>

次に RewriteOptions の AddIISUrlRewrite()メソッド を呼出し、IIS Rewrite設定ファイル「IISUrlRewrite.xml」を読み込みます。
以下の実装のように「Add~()」メソッドはチェインして重ねて定義することができます。

  var options = new RewriteOptions()
    .AddRewrite(@"simple-rewrite-rule/(\d+)", "Rewritten/simple?id=$1", true)
    .AddApacheModRewrite(env.ContentRootFileProvider, "apache_mod_rewrite.txt")
    .AddIISUrlRewrite(env.ContentRootFileProvider, "IISUrlRewrite.xml");
  app.UseRewriter(options);

リライト先のコントローラには IisRewrite()メソッド を追加します。

// Controller/RewrittenController.cs
using Microsoft.AspNetCore.Mvc;

namespace RewriteExampleCoreWeb.Controllers
{
  public class RewrittenController : Controller
  {
    [HttpGet]
    public IActionResult IisRewrite(int id)
    {
      return Content(string.Format("called RewittenControlle.IisRewrite({0})", id));
    }

    ... 省略
  }
}
実行

ブラウザで「http://localhost:6048/iis-rules-rewrite/789」にアクセスすると以下の実行結果が得られます。

f:id:daigo-knowlbo:20170401023436p:plain

その他(リダイレクト)

上記以外に以下の設定が可能です。

  • AddRedirect()設定によるリダイレクト
  • メソッドベースルールによるリダイレクト
  • IRuleベースルールによるリダイレクト

ただしこれらは「リライト」ではなく「リダイレクト」になるため、本投稿では割愛させていただきます。

また、上記3リダイレクト方式を含んだ公式ドキュメントは以下になります。

docs.microsoft.com