Heroku 应用程序的 CNAME 导致 301 重定向

Heroku 应用程序的 CNAME 导致 301 重定向

总结:我希望我的自定义域名显示在地址栏中,而不是 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

但如果我 curl 我的自定义域名,我会得到 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.comURL,而不是我的自定义 URL。

Heroku 文档比如说:

即使您设置了自定义域,您的应用的 Heroku 域也将始终保持活动状态。如果您希望用户只使用自定义域,您的应用应发送 HTTP 状态 301 Moved Permanently 以告知 Web 浏览器使用自定义域。Host HTTP 请求标头字段将显示用户尝试访问哪个域;如果该字段为 example.herokuapp.com,则发送重定向。

以上内容适用于我吗?

答案1

事实证明,重定向发生在应用程序级别。Heroku 的支持人员确认他们的路由器不会添加任何重定向。

答案2

如果你遵循指示然后在添加自定义域之前,您需要更新配置:

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

答案3

对于遇到此问题的其他任何人,有一个快速(但不安全)的解决方案。如果您的应用程序正在处理任何敏感数据,例如信用卡信息或用户登录详细信息,那么不要使用此方法,但要设置您的应用程序以使用 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")

下次重新部署时,您应该能够在自定义域上访问您的应用程序。

相关内容