ruby-on-rails – 如何使用gem rack-rewrite将301重定向从裸域到www域的完整URL

我在Heroku上托管了一个Rails 2.3.2应用程序.

裸域和www子域是几年前添加的,它们都有一些搜索引擎的权限.

然而问题是搜索引擎看到内容是重复的,所以我想做301从裸域重定向到www子域.

我已经问过Zerigo DNS我是否可以通过他们的平台做到这一点他们说不,我必须在Heroku的一边做. Heroku不允许访问服务器,所以我需要一些Rack中间件来执行此操作.

根据这个答案here,gem rack-rewrite可以做到这一点.

然而,我真的是关于这个的NOOB,我不知道如何设置它,以便裸域中的任何URL将被重定向到www子域.

例:

example.com/products/12 => www.example.com/products/12

我目前正在应用程序控制器中执行错误操作,如下所示:

 before_filter :ensure_domain

protected 

  def ensure_domain
      app_domain = "www.example.com"
      naked_domain = "example.com"
      page_path = request.fullpath
    if request.env['HTTP_HOST'] == naked_domain  && RAILS_ENV == 'production'
      #HTTP 301 is a permanent redirect
        redirect_to "http://#{app_domain}#{page_path}", :status => 301
    end
  end

这有效,但我知道我应该在Rack Middleware中这样做.

有人能告诉我如何使用rack-rewrite gem进行设置吗?

我已将以下内容添加到application_controller.rb文件中:

config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
 r301 %r{.*}, 'http://www.example.com$&', :if => Proc.new {|rack_env|
  rack_env['SERVER_NAME'] != 'www.example.com'
}
end

这会产生以下错误:

NameError(未定义的局部变量或ApplicationController的方法`config’:Class):

关于如何让这个设置工作的任何想法?

最佳答案 你也可以使用
rack-host-redirect宝石.添加到Gemfile:

gem 'rack-host-redirect'

在config / environments / production.rb中:

config.middleware.use Rack::HostRedirect, {
  'yourdomain.com' => 'www.yourdomain.com'
}

使用此配置,对yourdomain.com的所有请求都将被重定向到www.yourdomain.com.

点赞