我在 Heroku 上运行一个网站,其自定义域名由我的客户通过 Network Solutions 注册。该网站通过常规 HTTP 和 SSL 运行。
由于其分布式特性,Heroku 要求自定义域名使用 CNAME DNS 记录指向其服务器,指向 www.example.com,而不是指向特定 IP 地址的顶点 A 记录。因此,网站需要将顶点域重定向到 www 子域;http://example.com
变为http://www.example.com
。此外,https://example.com
需要重定向到https://www.example.com
。
根据 Heroku 的文档,一切似乎都设置正确(https://devcenter.heroku.com/articles/ssl-endpoint在配置 DNS 的网络解决方案端,有一个 CNAME 通配符记录,将所有子域指向 Heroku 的 SSL 端点地址:
CNAME * example-1234.herokussl.com
为了使重定向从顶级域到 www 子域起作用,我遵循 Network Solutions 提供的指示:http://www.networksolutions.com/support/how-to-forward-your-network-solutions-domain-name-to-a-free-blog-service/。这会产生以下 A 记录:
@ none 205.178.189.129
所有这些的结果http://example.com
是, 正确重定向到http://www.example.com
。但是,https://example.com
它不仅没有重定向,而且还超时:
% curl -kvI https://example.com
* About to connect() to example.com port 443 (#0)
* Trying 205.178.189.129... Operation timed out
* couldn't connect to host
* Closing connection #0
curl: (7) couldn't connect to host
但是,通过 HTTP 连接确实有效:
% curl -kvI http://example.com
* About to connect() to example.com port 80 (#0)
* Trying 205.178.189.129... connected
* Connected to example.com (205.178.189.129) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.20.0 (i386-apple-darwin8.11.1) libcurl/7.20.0 OpenSSL/0.9.7l zlib/1.2.3 libidn/1.15
> Host: example.com
> Accept: */*
>
< HTTP/1.1 302 Moved Temporarily
HTTP/1.1 302 Moved Temporarily
< Content-Length: 0
Content-Length: 0
< Location: /?3e3ea140
Location: /?3e3ea140
<
* Connection #0 to host example.com left intact
* Closing connection #0
因此,Network Solutions 的特殊重定向魔法似乎适用于 HTTP,但不适用于 SSL。有人知道他们是否支持这样的重定向吗?或者我是否需要说服我的客户转向新的注册商/DNS 提供商?
答案1
HTTPs 协商发生在发送任何 HTTP 响应标头(包括 HTTP 状态代码和 Location 标头)之前。
这意味着,为了重定向版本https
,Network Solution 应该安装您的域证书并将其服务器配置为监听端口 443。
我没有看到关于此功能的任何提及,看起来他们提供了在该 IP 地址可用的简单重定向服务,但这意味着您无法将根域的 HTTPS 版本重定向到 www 主机名。
一种可能的解决方案是将根域指向 Heroku 应用程序(使用解析 SSL 端点返回的 A 名称之一。一些 DNS 提供商还为根域提供类似 CNAME 的功能),然后在内部处理重定向。这是处理托管在 Heroku 上的应用程序的根域到 www 重定向的最常用方法。