2014-03-06 4 views
7

Ich möchte das www umleiten. Version zu der Nicht-WWW-Version der Site, es sei denn, es handelt sich um eine Subdomain. (Beispiel: Redirect www.puppies.com zu puppies.com, aber nicht umleiten www.cute.puppies.com).Ruby on Rails umleiten www. zu nicht-www Version der Website

Wie bewerkstellige ich dies, während ich den vollständigen Anfragepfad pflege? (Beispiel: www.puppies.com/labradors geht an puppies.com/labradors)

Antwort

11

in Ihrer Anwendung Controller:

before_filter :redirect_subdomain 

def redirect_subdomain 
    if request.host == 'www.puppies.com' 
    redirect_to 'http://puppies.com' + request.fullpath, :status => 301 
    end 
end 

Wie @isaffe weist darauf hin, Sie auch im Web-Server umleiten.

BEARBEITEN Sie: Verwenden Sie permanenten Redirect-Status (301) für SEO (wie von @CHawk vorgeschlagen) oder 307 wenn temporär.

+0

Ich bearbeiten die Antwort richtig, sowohl Host und fullpath zu verwenden. – noel

+0

Sie können globale Variable wie: redirect_to Rails.application.config.action_mailer.asset_host + request.fullpath anstelle der fest codierten URL verwenden, aber denken Sie daran, sie in der Produktions- oder Entwicklungsdatei nach Bedarf zu definieren. –

+0

Wahr. Oder streichen Sie einfach das "www." von der Host-Zeichenfolge, wenn es dort ist, und leiten Sie es zu einer neu erstellten URL um. – noel

3

Der Vollständigkeit halber können Sie die Schienen Routing-Konfiguration verwenden, um dies in Rails zu tun 4 mit request-based routing constraints

Auf diese Weise hat einen kleinen Leistungsvorteil gegenüber der Verwendung Ihrer Anwendungscontroller, da die Anforderung nicht auf den Anwendungscode trifft, der während der Routing-Middleware von Rails verarbeitet wird.

Platz nach dem in Ihren Routen-Datei (config/routes.rb)

zB:

Rails.application.routes.draw do 

    # match urls where the host starts with 'www.' as long it's not followed by 'cute.' 
    constraints(host: /^www\.(?!cute\.)/i) do 

    match '(*any)', via: :all, to: redirect { |params, request| 

     # parse the current request url 
     # tap in and remove www. 
     URI.parse(request.url).tap { |uri| uri.host.sub!(/^www\./i, '') }.to_s 

    } 

    end 

    # your app's other routes here... 

end 
0

in Ihrer Anwendung Controller:

before_action :redirect_from_www_to_non_www_host 

    def redirect_from_www_to_non_www_host 
    domain_parts = request.host.split('.') 
    if domain_parts.first == 'www' 
     redirect_to(request.original_url.gsub('www.', ''), status: 301) and return 
    end 
    end