2019-10-13 21:50:00
【Elixir Phoenix】トレイリングスラッシュ( trailing slash )をplugで実装する
目次
- バージョン情報
- すでにモジュールはないのか
- トレイリングスラッシュとは
- 実装
- 参考サイト
バージョン情報
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リダイレクトされます。
参考サイト
- https://elixirschool.com/ja/lessons/specifics/plug/
- https://hexdocs.pm/phoenix/plug.html
- https://elixirforum.com/t/append-trailing-slash-on-all-urls/11918/6
- https://qiita.com/FL4TLiN3/items/18fa81c30fc9aeba7223
- https://seolaboratory.jp/91222/
- https://www.suzukikenichi.com/blog/differences-between-trailing-slash-and-non-trailing-slash/
- https://webmaster-ja.googleblog.com/2010/11/url.html
- https://hexdocs.pm/elixir/String.html#last/1
- https://wa3.i-3-i.info/word11910.html