2009-11-10 16 views
8

Problema simple pero parece que no puede encontrar una respuesta haciendo una búsqueda rápida en Google. ¿Cuál es la forma de Rails de hacer esto directamente con 301 (http://x.com/abc>http://www.x.com/abc). A before_filter?Redirige las solicitudes que no son www a www urls en Rails

+1

¿por qué quiere www allí? ¿Qué te da? Checkout http://no-www.org/index.php –

+0

@James - Un uso común de www. es para que no necesite un segundo dominio "sin cookies" para publicar contenido estático. – MiffTheFox

Respuesta

17

Lo ideal sería hacerlo en la configuración de su servidor web (Apache, nginx etc.) para que la solicitud ni siquiera toque Rails en absoluto.

Añadir la siguiente before_filter a su 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 

Si quería hacer la redirección usando Apache, se puede usar esto:

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

Gran respuesta John. Si está utilizando Rails> = 2.3, le sugiero usar un Metal en su lugar. :) –

+0

Gracias! Sí, buen punto sobre el Metal. –

+0

¡De nada! –

7

Si bien la respuesta de Juan está perfectamente bien, si estás usando Rails> = 2.3. Sugeriría crear un nuevo Metal. Rails Metals son más eficientes y ofrecen un mejor rendimiento.

$ ruby script/generate metal NotWwwToWww 

A continuación, abra el archivo y pegue el siguiente código.

# 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 

Por supuesto, puedes personalizar más el Metal.

Si desea utilizar Apache, here's a few configurations.

+0

Simone, algún consejo sobre cómo usar esto con Rails 3? Me gustaría redireccionar 'www.foo.com' a' foo.com'. –

+0

Con Rails 3 es aún más fácil: utilice el método de "redirección" de enrutamiento. No es necesario usar un Metal. –

3

hay una mejor carriles de 3 vías - poner esto en su routes.rb archivo:

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 

actualización

Aquí es cómo hacer que el dominio agnóstico:

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

El enlace está roto. – iamnotmaynard

7

Para carriles 4, úsela -

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 
+1

salvó mi vida gracias – Kathan

+2

esto descarta la ruta URL –

+1

sí, redirige a la página principal, por lo que no es muy útil :( – Gediminas

0

Puede probar el código de abajo -

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