Nao000のぶろぐ

蝶を追っている少年になりたい

【Elixir Phoenix】トレイリングスラッシュ( trailing slash )をplugで実装する

目次

  1. バージョン情報
  2. すでにモジュールはないのか
  3. トレイリングスラッシュとは
  4. 実装
  5. 参考サイト

バージョン情報

Elixir: 1.8.1

Phoenix: 1.4.2

すでにモジュールはないのか

なさそうでした。

トレイリングスラッシュとは

URL末尾に付けるスラッシュのことです。SEO対策の1つにURL末尾にスラッシュを付けてURLの正規化を行うものがあります。

例えばElixir記事一覧のページには次の2つのURLでアクセスすることができます。末尾のスラッシュに注目してください。トレイリングスラッシュではURLの末尾にスラッシュを付けてURLを統一します。これによりGoogleBOTに2つのページではなく、1つのページであることを主張します。

  • https://www.nao000.com/category/elixir
  • https://www.nao000.com/category/elixir/

正直、この末尾スラッシュの有無の重要性は分かりません。個人的に統一されているほうがカッコいいから対応します。

実装

実装概要は大きく分けて2ステップです。

  • plugを用意する
  • routerで読み込ませる
  • 終わり

plugを用意する

今回plugというものを初めて自作しました。plugがどういうものかは良く分かっていません。「リクエストに対して必ず何かを処理したい場合にplugを用意する」という認識でいます。

initが最初に実行されて、callが実行されます。リダイレクトする部分で明示的にステータスコードを301にしていますが、無くても301リダイレクトされてました。

    defmodule Nao000dotcom.Myplug.Trailingslash do
      import Plug.Conn
      use Nao000dotcomWeb, :controller

      def init(options) do
        options
      end

      def call(conn, _params) do
        conn.request_path |> String.last() |> redirectTrailingSlash(conn)
      end

      defp redirectTrailingSlash("/", conn) do
        conn
      end

      defp redirectTrailingSlash(_lastChar, conn) do
        conn
        |> put_status(301)
        |> redirect(to: conn.request_path <> "/")
      end
    end

routerで読み込ませる

router.exで先程実装したplugを読み込ませます。末尾スラッシュが無い場合でアクセスした場合にリダイレクト以外の処理をなるべく無くすために最初に読み込ませます。

    defmodule Nao000dotcomWeb.Router do
      use Nao000dotcomWeb, :router

      pipeline :browser do
        plug Nao000dotcom.Myplug.Trailingslash
        plug :accepts, ["html"]
        plug :fetch_session
        plug :fetch_flash
        plug :protect_from_forgery
        plug :put_secure_browser_headers
      end

      ~省略~

終わり

実装は以上です。これで末尾にスラッシュが無い場合は、同じURLで末尾にスラッシュが付いたURLに301リダイレクトされます。

参考サイト