2009-11-10 15 views
8

Semplice problema, ma non riesco a trovare una risposta facendo qualche ricerca su Google. Qual è il modo Rails di fare questo 301 diretto (http://x.com/abc>http://www.x.com/abc). Un before_filter?Reindirizza le richieste non www agli URL URL in Rails

+1

perché vuoi www lì? cosa ti dà? Checkout http://no-www.org/index.php –

+0

@James - Un uso comune di www. è così che non è necessario un secondo dominio "senza cucina" per servire il contenuto statico. – MiffTheFox

risposta

17

Idealmente lo si farebbe nella configurazione del server Web (Apache, nginx ecc.) In modo che la richiesta non tocchi nemmeno Rails.

Aggiungere il seguente before_filter al 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 

Se avete voglia di fare il redirect usando Apache, è possibile utilizzare questo:

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

Ottima risposta Giovanni. Se stai usando Rails> = 2.3, suggerirei di usare un Metal invece. :) –

+0

Grazie! Sì, buon punto sul Metal. –

+0

Prego! –

7

Mentre la risposta di Giovanni è perfettamente bene, se stai usando Rails> = 2.3 Suggerirei di creare un nuovo Metal. Rails Metals sono più efficienti e offrono prestazioni migliori.

$ ruby script/generate metal NotWwwToWww 

Quindi aprire il file e incollare il seguente codice.

# 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 

Naturalmente, è possibile personalizzare ulteriormente il Metallo.

Se si desidera utilizzare Apache, here's a few configurations.

+0

Simone, qualche consiglio su come usarlo con Rails 3? Mi piacerebbe reindirizzare 'www.foo.com' a' foo.com'. –

+0

Con Rails 3 è ancora più semplice: usa il metodo di reindirizzamento 'reindirizzamento'. Non c'è bisogno di usare un metallo. –

3

v'è una migliore Rails 3 vie - mettere questo nel tuo routes.rb del file:

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 

Aggiornamento

Ecco come farlo dominio agnostico:

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

Il collegamento è interrotto. – iamnotmaynard

7

Per rails 4, usalo -

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

mi ha salvato la vita grazie – Kathan

+2

questo rigetta il percorso URL –

+1

sì, reindirizza alla homepage, quindi non molto utile :( – Gediminas

0

È possibile provare il codice qui sotto -

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