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

标签 ruby-on-rails rack-rewrite

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

裸域和www子域是多年前添加的,它们对搜索引擎都有一定的权限。

然而问题是搜索引擎将内容视为重复,所以我想从裸域到 www 子域进行 301 重定向。

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

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

然而,我真的是一个菜鸟,我不知道如何设置它以便来自裸域的任何 url 都将 301 重定向到 www 子域。

例子:

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

我目前在应用程序 Controller 中做错误的事情如下:

 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

这有效,但我知道我应该在机架中间件中执行此操作。

有人可以告诉我如何使用机架重写 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:Class 的未定义局部变量或方法“config”):

关于如何使此设置正常工作的任何想法?

最佳答案

您也可以使用 rack-host-redirect gem 。添加到 Gemfile:

gem 'rack-host-redirect'

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

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

关于ruby-on-rails - 如何使用 gem rack-rewrite to 301 重定向从裸域到 www 域的完整 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38196789/

相关文章:

css - sprockets 使用 twitter bootstrap 以随机顺序加载 sass

ruby-on-rails - 需要将 WP 博客与 Heroku 上的 Rails 应用程序链接起来

ruby - 将查询字符串添加到机架重写响应

ruby-on-rails - Ruby 在数组中排序哈希时遇到问题

ruby-on-rails - 具有大量小写入和长读取的 Rails 前端的 PostgreSQL 集群的最低硬件要求和设置是什么?

ruby-on-rails - Rails 4 searchkick 具有多对多关系

ruby-on-rails - Rails 参数 escape/unescape +

ruby-on-rails - 如何使用机架重写将 www 添加到 url?

ruby-on-rails - 使用 ransack 过滤器中的多个变量重写动态 URL