将http://domain.com/subpage重定向到Rails中的http://www.domain.com/subpage

时间:2013-01-25 17:44:14

标签: ruby-on-rails redirect dns

我认为这不是一个非常困难的问题,但我使用了很多不同的解决方案而且并不知道最好的解决方案。

我正在使用Ruby on Rails并将我的应用程序放在Heroku上,我希望301将我的裸域(@)上的所有内容重定向到我的www域。 E.g。

http://domain.com - > http://www.domain.com http://domain.com/subpage - > http://www.domain.com/subpage

现在我通过首先删除@和www条目来处理我的DNS。然后我将整个网站的重定向设置为http://www.domain.com(为@和www重新创建DNS条目)。最后,我将我的www DNS条目更改为CNAME和heroku-app的名称(http://myapp.herokuapp.com)。

这似乎是将http://domain.com/subpage转发给http://www.domain.com(没有子页面)。

我现在正在寻找的是以简单/优雅的方式处理这个问题的正确/推荐方法。

DNS? 路线? 的.htaccess? (如果是这样,我如何改变RubyOnRails中的.htaccess)

提前致谢!

4 个答案:

答案 0 :(得分:1)

These questions可能与您的问题有关,可能会查看这些问题。看来(根据我的读法),heroku不允许访问.htaccess或任何东西,所以看起来像Rack中间件是最好的选择。

答案 1 :(得分:1)

您的域名在哪里注册?如果使用GoDaddy,他们会提供一项服务,为您处理301重定向,但它要求您注册其中一个主机方案。成本最低(每月约5美元)。不是免费的,但是没有痛苦,不需要编码等。

答案 2 :(得分:1)

(注意:没有尝试过这个,但它应该有效)

有人可能认为 nice 方式是使用DNS或您的Web服务器功能来实现这一点。但是,如果需要,可以使用rails。

总而言之,它的优势在于,您可以轻松地保留任何参数/路径,就像您所说的那样。此外,逻辑在应用程序内部,如果您需要扩展/更改域名,则不会丢失。不好的一面是,只要有人使用裸域名,您的完整堆栈就会被点击。

您可以在应用程序控制器中尝试before_filter

before_filter :redirect_to_www

def redirect_to_www
  redirect_to subdomain: 'www' unless request.subdomain == 'www'
end

如果您想避免“魔术重定向”并让每个人都清楚,在rails 3上您可以直接在路线中执行此操作:

constraints ->(request){ request.subdomain != 'www' } do
  match '(*all)' => redirect( subdomain: 'www' )
end 

您还应该将子域添加到默认的URL选项(应用程序控制器):

def default_url_options( option = {} )
  {subdomain: 'www'}
end

答案 3 :(得分:0)

最后我要做的是将@ -DNS指向我的普通网络主机(因为@要求IP和Heroku只接受CNAME)和www-DNS到Heroku。

在我的普通虚拟主机上,我放了一个.htaccess,将所有流量重定向到我的www域,如下所示:

RewriteEngine On

### re-direct to www
RewriteCond %{HTTP_HOST} ^domain.com
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]