将非www请求重定向到Rails中的www URL

时间:2009-11-10 07:48:10

标签: ruby-on-rails

简单的问题,但似乎无法找到一些快速谷歌搜索的答案。 Rails直接执行此操作的方式是什么(http://x.com/abc> http://www.x.com/abc)。一个before_filter?

7 个答案:

答案 0 :(得分:18)

理想情况下,您可以在Web服务器(Apache,nginx等)配置中执行此操作,以便请求根本不会触及Rails。

将以下before_filter添加到您的ApplicationController

class ApplicationController < ActionController::Base
  before_filter :add_www_subdomain

  private
  def add_www_subdomain
    unless /^www/.match(request.host)
      redirect_to("#{request.protocol}x.com#{request.request_uri}",
                  :status => 301)
    end
  end
end

如果您确实想使用Apache进行重定向,可以使用:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.x\.com [NC]
RewriteRule ^(.*)$ http://www.x.com/$1 [R=301,L]

答案 1 :(得分:8)

对于rails 4,请使用它 -

  before_filter :add_www_subdomain

  private
  def add_www_subdomain
    unless /^www/.match(request.host)
      redirect_to("#{request.protocol}www.#{request.host_with_port}",status: 301)
    end
  end

答案 2 :(得分:7)

虽然约翰的答案非常好,但如果你使用的是Rails&gt; = 2.3,我建议你创建一个新的Metal。 Rails Metals效率更高,效果也更好。

$ ruby script/generate metal NotWwwToWww

然后打开文件并粘贴以下代码。

# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)

class NotWwwToWww
  def self.call(env)
    if env["HTTP_HOST"] != 'www.example.org'
      [301, {"Content-Type" => "text/html", "Location" => "www.#{env["HTTP_HOST"]}"}, ["Redirecting..."]]
    else
      [404, {"Content-Type" => "text/html"}, ["Not Found"]]
    end
  end
end

当然,您可以进一步定制Metal。

如果您想使用Apache,here's a few configurations

答案 3 :(得分:3)

有一个更好的Rails 3方式 - 把它放在你的routes.rb文件中:

  constraints(:host => "example.com") do
    # Won't match root path without brackets around "*x". (using Rails 3.0.3)
    match "(*x)" => redirect { |params, request|
      URI.parse(request.url).tap { |x| x.host = "www.example.com" }.to_s
    }
  end

<强>更新

以下是如何使其与域无关:

  constraints(subdomain: '') do
    match "(*x)" => redirect do |params, request|
      URI.parse(request.url).tap { |x| x.host = "www.#{x.host}" }.to_s
    end
  end

答案 4 :(得分:0)

我在尝试实现相反时发现了这篇文章(www到根域重定向)。 所以我写了一段代码redirects all pages from www to the root domain

答案 5 :(得分:0)

您可以尝试以下代码 -

location / {
  if ($http_host ~* "^example.com"){
    rewrite ^(.*)$ http://www.example.com$1 redirect;
  }
}

答案 6 :(得分:0)

另一种解决方案可能是使用rack-canonical-host gem,它具有很多额外的灵活性。在config.ru中添加一行:

use Rack::CanonicalHost, 'www.example.com', if: 'example.com'
仅当主机匹配 example.com 时,

才会重定向到 www.example.com 。 github自述文件中的许多其他示例。