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")
Вы хотите внести следующие изменения:
У вас должно получиться примерно следующее:
# 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")
При следующем повторном развертывании вы сможете посетить свое приложение в личном домене.