我正在尝试为我的heroku应用程序设置SSL . 我使用的是基于主机名的SSL插件 . heroku documentation陈述如下:
Hostname based SSL will not work with root domains as it relies on CNAME
aliasing of your custom domain names. CNAME aliasing of root domains is
an RFC violation.
正如预期的那样,当我使用www子域访问该站点时,一切运行良好,即https://www.foo.com . 当我访问https://foo.com时,浏览器会抱怨,因为提供的证书是针对heroku.com的 .
我得出结论,我必须将foo.com的流量重定向到www.foo.com以解决此问题 . 我正在考虑以下方法:
1) DNS based redirection
DNS提供商Zerigo supports重定向记录 . 我在SO上发现了一个关于类似主题的question . 我尝试了解决方案,它只适用于HTTP重定向(Zerigo文档证实了这一点) .
我的Zerigo配置:
foo.com A x.x.x.x
foo.com redirect http://www.foo.com
www.foo.com CNAME zzz.amazonaws.com
2) Rack based redirection
添加基于机架的中间件以执行重定向 . canonical-host gem提供了这样的支持 .
use CanonicalHost do
case Rails.env.to_sym
when :staging then 'staging.foo.com'
when :production then 'www.foo.com'
end
end
我想知道是否有更好的解决方案(除非转换为每月100美元的基于IP的SSL)
6 回答
哇...这让我永远,网上的一堆信息都是错的 . 即使Heroku的文档似乎也没有表明这是可能的 .
但是Jesper J的回答提供了一个正确方向的暗示:它与DNSimple的ALIAS记录一起使用,我想这是他们创建的一种新的DNS记录 . 我不得不将我的DNS服务切换到它们只是为了获得这种记录类型(以前使用EasyDNS) .
澄清何时我说“工作”我的意思是:
使用根域的SSL上的整个站点
没有浏览器警告
使用Heroku的Endpoint SSL产品(每月20美元)
它适用于以下所有网址(将它们重定向到https://foo.com,没有任何警告)
http://foo.com
http://www.foo.com
https://www.foo.com
https://foo.com
总结重要的一点 .
将你的DNS转移到DNSimple(如果有人知道提供ALIAS记录的其他提供商请将它们发布在评论中,它们是我能找到的唯一一个)
设置Heroku endpoints ssl正常https://devcenter.heroku.com/articles/ssl-endpoint
返回DNSimple添加
ALIAS
记录,指向foo.com
到您的heroku ssl endpoints ,类似于waterfall-9359.herokussl.com
还要添加一条指向
www.foo.com
的CNAME记录到您的heroku ssl endpoints ,waterfall-9359.herokussl.com
终于在你的rails(或其他)应用程序中进行以下设置:
在
production.rb
设置在
application_controller.rb
添加这最终似乎有效!关键部分似乎是
ALIAS
dns记录 . 如果有人知道,我会很好奇地了解它是如何工作的,以及它是多么可靠/成熟 . 似乎可以做到这一点 .DNSimple提供ALIAS记录类型以满足此需求 . 您可以从指向CNAME的根域(a.k.a zone apex)创建别名 . 在这里阅读更多相关信息:
http://blog.dnsimple.com/introducing-the-alias-record/
DNS重定向不关心入站请求是http还是https,因此会保留原始协议 - 因此会将http://foo.com重定向到http://www.foo.com,对于https也是如此 .
您需要通过您找到的gem或其他一些机架重定向gem或者如果www在应用程序中执行此操作 . 使用基于IP的SSL插件是一个问题 .
您要记住的一件事是,如果两个版本都可访问,谷歌可能会为您的网站的两个版本编制索引(Root vs WWW) . 您需要设置锥形来处理可能需要维护的痛苦 .
在我的DNS设置中,我设置了一个URL /转发记录(DNS简单)
只需要为WWW设置CNAME设置
我还必须为我的root设置和Alias
然后我决定简单地将 foo.com 替换为env变量
ENV['SITE_HOST']
(其中SITE_HOST = www.foo.com或我可能定义的任何内容) . 我可以通过我的heroku配置或我的.env文件来控制它(参见https://github.com/bkeepers/dotenv) . 这样,我可以控制在不同环境中发生的事情 .例如,我的测试应用程序使用 test.foo.com 作为URL它也有自己的SSL endpoints ,这样我就可以正常工作 . 这也可以扩展到创建临时或qa特定环境 .
从现在开始,最终用户将始终使用强制SSL访问www . 旧的链接将遭受一个小挂,但没有什么值得注意的 .
在Rails部分,为了进行重定向,让它更容易在路由器层上出现,就像这样(适用于Rails 3):
对于那些以前使用godaddy的heroku用户,我刚刚完成从godaddy到cloudflare的DNS移植 . 并且https现在正常运行 .
Godaddy DNS与heroku不兼容 . 还有这个是由于:
设置非常简单 .
首先,将cloudflare的名称服务器添加到godaddy dns管理器中 . 这些是一些例子:
接下来,您只需要再执行两个步骤 .
添加CNAME
NAME.com
并将其链接到NAME.com.herokudns.com
就是这样 . 这假设你已经有一个CNAME
www.NAME.com
链接到www.NAME.com.herokudns.com
如果您使用的是Rails,请务必在
config/environment/production.rb
设置config.force_ssl = true