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的答案 – 他的方法清晰,简单,有效且可定制。