36 votes

Comment rediriger sans www en utilisant Rails 3 / Rack?

Je comprends qu'il ya beaucoup de questions que répondre à cette question. Je suis familier avec .htaccess et nginx.conf méthodes, mais je n'ai pas accès à la configuration traditionnelle des méthodes sur heroku.

Simone Carletti a donné cette réponse, qui tire parti de Rails 2.x les Métaux, mais je suis à l'aide de Rails 3 et ce n'est pas compatible. Rediriger les non-requêtes www www les url dans les Rails

Veuillez noter:

Je ne suis pas à la recherche d'un simple before_filter dans mon ApplicationController. J'aimerais faire une réécriture similaire à Simone. Je crois que c'est du travail pour le serveur web ou middleware comme Rack à tout le moins, donc je voudrais quitter ce peu en dehors de l'application du code.

Objectif

redirect                to                  status
----------------------------------------------------
www.foo.com             foo.com             301
www.foo.com/whatever    foo.com/whatever    301

Seuls les hôtes de correspondance /^www\./ devrait être de redirection. Toutes les autres demandes doivent être ignorés.

51voto

Oliver Morgan Points 223

dans Rails 4, suppression de www. à partir de n'importe quelle URL tout en maintenant le chemin d'accès peut être obtenu simplement en utilisant:

 # config/routes.rb

constraints subdomain: 'www' do
  get ':any', to: redirect(subdomain: nil, path: '/%{any}'), any: /.*/
end
 

En revanche, en ajoutant www. au début de toute URL qui ne l’a pas déjà peut être atteint par:

 # config/routes.rb

constraints subdomain: false do
  get ':any', to: redirect(subdomain: 'www', path: '/%{any}'), any: /.*/
end
 

13voto

Sean Schofield Points 482

Il existe une meilleure approche si vous utilisez Rails 3. Tirez simplement parti de l’intérêt du routage.

 Foo::Application.routes.draw do
  constraints(:host => /^example.com/) do
    root :to => redirect("http://www.example.com")
    match '/*path', :to => redirect {|params| "http://www.example.com/#{params[:path]}"}
  end
end
 

12voto

Duke Points 2752

J'aime beaucoup utiliser le routeur Rails pour de telles choses. Les réponses précédentes étaient bonnes, mais je voulais quelque chose de général que je puisse utiliser pour n'importe quelle URL commençant par "www".

Je pense que c'est une bonne solution:

 constraints(:host => /^www\./) do
  match "(*x)" => redirect { |params, request|
    URI.parse(request.url).tap {|url| url.host.sub!('www.', '') }.to_s
  }
end
 

7voto

Ilya Sabanin Points 659

Jetez un oeil à cet intergiciel, il devrait faire exactement ce que vous voulez:

http://github.com/iSabanin/www_ditcher

Faites-moi savoir si cela a fonctionné pour vous.

7voto

Will Koehler Points 1002

Une version en une ligne de la solution de Duke. Il suffit d'ajouter au sommet de routes.rb

 match '(*any)' => redirect { |p, req| req.url.sub('www.', '') }, :constraints => { :host => /^www\./ }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X