不使用htaccess将'myapp.com'重定向到rails中的'www.myapp.com'?

时间:2008-11-29 03:39:48

标签: ruby-on-rails redirect subdomain

使用Morph Labs的Appspace部署网站意味着没有自动方式将“myapp.com”重定向到“www.myapp.com”(并且无法访问.htacess)。

有这样的轨道方式吗?我需要一个像subdomain-fu这样的插件吗?

更具体地说,我正在尝试做类似的事情:

  • 'myapp.com'=> 'www.myapp.com'
  • 'myapp.com/session/new'=> 'www.myapp.com/session/new'

基本上,我总是希望每个请求都附加'www'子域名(因为SSL证书的具体名称是'www.myapp.com')。

7 个答案:

答案 0 :(得分:30)

也许这样的事情可以解决问题:

class ApplicationController < ActionController::Base
  before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
  end
end

答案 1 :(得分:9)

卡森的回答很有效。

这是代码走另一条路(www - &gt; no www)

before_filter :check_uri

def check_uri
  if /^www/.match(request.host)
    redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri 
  end
end

答案 2 :(得分:5)

我不得不改变Carson的答案,让它在Rails 3中运行。我用request.fullpath替换了request.uri:

class ApplicationController < ActionController::Base
  protect_from_forgery

  Rails.env.production? do
    before_filter :check_url
  end

  def check_url
    redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
  end
end

答案 3 :(得分:2)

这对我很有用。我确实做了一个小的补充,因为我只想在生产环境中使用这种行为:

def check_uri
  redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end

答案 4 :(得分:1)

答案 5 :(得分:0)

以下是几种不同的方法:

 head :moved_permanently, :location => ‘http://www.newdomain.com’

另一:

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 

答案 6 :(得分:0)

对于那些希望使用heroku强制使用SSL的人来说,这对我来说很有效,基于Heroku SSL on root domain

在我的DNS设置中,我设置了一个URL /转发记录(DNS简单)

URL foo.com     3600        http://www.foo.com

只需为WWW设置CNAME设置

CNAME   www.foo.com 3600        providedssslendpoint.herokussl.com

我还必须为我的root设置和Alias

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

然后我决定简单地用env变量ENV['SITE_HOST']替换 foo.com (其中SITE_HOST可能等于www.foo.com或test.foo.com)所以我可以控制通过我的heroku配置。这样,我可以控制在不同环境中发生的事情。 (用于在本地设置env变量,请参阅https://github.com/bkeepers/dotenv

例如,我的测试应用使用 test.foo.com 作为网址,它也有自己的SSL端点,因此对我来说效果很好。

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

从现在开始,最终用户将始终使用强制SSL访问www。旧的链接将遭受一个小挂,但没有什么值得注意的。