Heroku如何将http://重定向到http:// www
如何将http://vinderhimlen.dk重定向到http://www.vinderhimlen.dk ?
您最好的选择是设置与DNS提供商的重定向,以便在任何请求到达您的服务器之前很久就会发生。 来自Heroku开发中心 :
对于对裸域的所有请求,子域重定向会导致301永久重定向到指定的子域,以便正确路由所有当前和将来的请求,并在用户的位置字段中显示完整的www主机名。
DNSimple提供了一个方便的URL重定向,此处从
heroku-sslendpoint.com
裸域重定向到www.heroku-sslendpoint.com
子域。为了在Heroku上正确配置,www子域应该是对yourappname.herokuapp.com的CNAME记录引用。
这不仅仅是DNSimple。 我的DNS提供商是123 Reg ,他们支持它,但称之为web forwarding
。
我建议在请求生命周期中尽早做到这一点。 如果您要使用Apache,则需要将URL Rewrite添加到VirtualHosts文件中。 在Heroku上你需要添加一些Rack中间件。
这里作为另一种方式的例子 (即www.example.org
– > example.org
)。 我不认为你将它改成你的用例会有很大的问题。
这样,请求不会显示在您的日志中,也不需要所有Rails的请求解析。
我的解决方案
Terminal: heroku addons:add custom_domains:basic heroku domains:add www.vinderhimlen.dk heroku domains:add vinderhimlen.dk
然后(http://devcenter.heroku.com/articles/custom-domains):
class ApplicationController before_filter :ensure_domain APP_DOMAIN = 'www.vinderhimlen.dk' def ensure_domain if request.env['HTTP_HOST'] != APP_DOMAIN # HTTP 301 is a "permanent" redirect redirect_to "http://#{APP_DOMAIN}", :status => 301 end end end
假设您正在使用动作控制器,只需使用redirect_to
:
redirect_to "http://www.vinderhimlen.dk"
您还应该添加www域。
heroku domains:add www.vinderhimlen.dk
通常你会在HTTP服务器级别使用Apache的mod_rewrite
模块执行此操作,以便在请求甚至到达Rails的堆栈之前发生。 但是,Heroku不允许您访问其HTTP服务器配置,因此需要替代方案。
我建议看一下Refraction ,它是用于替换mod_rewrite
Rack中间件。 它允许您使用良好的可读Ruby代码编写重写规则,并且它仍然比使用Rails本身完成任务更快。
在这篇SO文章中看到Justice的答案 – 他的方法清晰,简单,有效且可定制。