简单的问题,但似乎无法找到一些快速谷歌搜索的答案。 Rails直接执行此操作的方式是什么(http://x.com/abc> http://www.x.com/abc)。一个before_filter?
答案 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自述文件中的许多其他示例。