Ideally you'd do this in your web server (Apache, nginx etc.) configuation so that the request doesn't even touch Rails at all.
Add the following before_filter
to your 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
If you did want to do the redirect using Apache, you could use this:
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\.x\.com [NC]
RewriteRule ^(.*)$ http://www.x.com/$1 [R=301,L]
Хотя ответ Джона прекрасен, если вы используете Rails> = 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, вот несколько конфигураций .
Я нашел эту статью, когда пытался добиться противоположного (перенаправление с www на корневой домен). Итак, я написал фрагмент кода, который перенаправляет все страницы с www в корневой домен .