总结:我希望我的自定义域名显示在地址栏中,而不是 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.com
URL,而不是我的自定义 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")
您想要进行以下更改:
- 将 URL 方案从 https 更改为 http
- 删除 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")
下次重新部署时,您应该能够在自定义域上访问您的应用程序。