Назад | Перейти на главную страницу

CNAME в приложение Heroku приводит к перенаправлению 301

TL; DR: Я хочу, чтобы в адресной строке отображался мой персональный домен, а не CNAME.

У меня есть приложение, размещенное на Heroku по адресу try-elixir-phoenix.herokuapp.com.

Я купил домен в Namecheap и настроил там запись CNAME:

www.tryelixir.online CNAME try-elixir-phoenix.herokuapp.com.

Я также настроил пользовательские домены в heroku:

 $ heroku domains
=== try-elixir-phoenix Heroku Domain
try-elixir-phoenix.herokuapp.com

=== try-elixir-phoenix Custom Domains
Domain Name           DNS Target
────────────────────  ────────────────────────────────
tryelixir.online      try-elixir-phoenix.herokuapp.com
www.tryelixir.online  try-elixir-phoenix.herokuapp.com

Но если я скручиваю свой собственный домен, я получаю перенаправление 301:

 $ curl --head http://www.tryelixir.online
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Server: Cowboy
Date: Thu, 25 Feb 2016 15:11:01 GMT
Content-Length: 0
Cache-Control: max-age=0, private, must-revalidate
Location: https://try-elixir-phoenix.herokuapp.com/
Via: 1.1 vegur

Это также означает, что пользователь видит herokuapp.com URL вместо моего собственного.

В Документы Heroku скажи это:

Домен Heroku вашего приложения всегда будет активен, даже если вы настроили собственный домен. Если вы хотите, чтобы пользователи использовали только персональный домен, ваше приложение должно отправлять HTTP-статус 301 Moved Permanently, чтобы указать веб-браузерам использовать персональный домен. Поле заголовка HTTP-запроса хоста покажет, к какому домену пытается получить доступ пользователь; отправьте перенаправление, если это поле example.herokuapp.com.

Применимо ли вышесказанное ко мне?

Если вы следовали инструкции то перед добавлением личного домена вам необходимо обновить конфигурацию:

url: [scheme: "https", host: "mysterious-meadow-6277.herokuapp.com", port: 443], force_ssl: [rewrite_on: [:x_forwarded_proto]]

Оказывается, перенаправление происходило на уровне приложения. Служба поддержки Heroku подтвердила, что их маршрутизатор не добавляет перенаправления.

Для всех, кто сталкивается с этой проблемой, есть быстрое (но небезопасное) решение. Если ваше приложение обрабатывает какие-либо конфиденциальные данные, например информацию о кредитной карте или данные для входа в систему, тогда НЕ используйте этот метод, но вместо этого настройте свое приложение для работы с SSL.

--- Небезопасное решение ---

В вашем файле config / prod.exs должно быть что-то вроде этого:

# config/prod.exs 

config :app, App.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "app.herokuapp.com", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  cache_static_manifest: "priv/static/manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")

Вы хотите внести следующие изменения:

  1. Измените схему URL с https на http
  2. Удалите конфигурацию force_ssl

У вас должно получиться примерно следующее:

# config/prod.exs 

config :app, App.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [scheme: "http", host: "app.herokuapp.com", port: 443],
  cache_static_manifest: "priv/static/manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")

При следующем повторном развертывании вы сможете посетить свое приложение в личном домене.