diff --git a/config/prod.exs b/config/prod.exs index 2e83dbc..462fcf0 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -7,7 +7,7 @@ config :chess, ChessWeb.Endpoint, root: "./assets", secret_key_base: "${SECRET_KEY_BASE}", server: true, - url: [host: "localhost", port: {:system, "PORT"}], + url: [host: "${HOST}", port: {:system, "PORT"}], version: Application.spec(:chess, :vsn) config :chess, Chess.Mailer, diff --git a/lib/chess_web/endpoint.ex b/lib/chess_web/endpoint.ex index 887496e..b93a5a5 100644 --- a/lib/chess_web/endpoint.ex +++ b/lib/chess_web/endpoint.ex @@ -23,6 +23,10 @@ defmodule ChessWeb.Endpoint do plug Phoenix.CodeReloader end + if Mix.env == :prod do + plug ChessWeb.Plugs.CanonicalDomain + end + plug Plug.RequestId plug Plug.Logger diff --git a/lib/chess_web/plugs/canonical_domain.ex b/lib/chess_web/plugs/canonical_domain.ex new file mode 100644 index 0000000..effc697 --- /dev/null +++ b/lib/chess_web/plugs/canonical_domain.ex @@ -0,0 +1,28 @@ +defmodule ChessWeb.Plugs.CanonicalDomain do + @moduledoc false + + import Plug.Conn + + def init(options) do + options + end + + def call(conn, _options) do + if conn.host != canonical_host() do + conn + |> put_status(:moved_permanently) + |> Phoenix.Controller.redirect(external: canonical_domain(conn)) + |> halt() + else + conn + end + end + + defp canonical_domain(conn) do + "//#{canonical_host()}#{conn.request_path}" + end + + defp canonical_host() do + ChessWeb.Endpoint.config(:url)[:host] + end +end