Comment faire pour rediriger sans le www à l'aide de 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
Seulement hôtes correspondant /^www\./
devrait être rediriger. Toutes les autres demandes doivent être ignorés.
- Je ne comprends pas la nécessité pour chaque méthode. Mon middlewares ne l'avez pas, et ils fonctionnent comme un charme.
- Ah, je vois maintenant: l'auto est retourné en tant que le corps de la réponse dans le cas de redirection, et le corps doit respond_to? :chaque. Ce n'est probablement pas la manière canonique. Je suggère simplement de retourner une chaîne vide ou [] que le corps de la réponse à la place.
- Je sais je suis en retard à la fête, mais pour les utilisateurs de google et d'utiliser cela plus tard: Méfiez-vous que cela va probablement faire vos tests échouent dans des moyens détournés comme le DEFAULT_HOST pour des tests rspec est "www.example.com" et toutes les demandes seront obtenir redirigé, même à l'intérieur de vos tests!
Vous devez vous connecter pour publier un commentaire.
dans Rails 4 retrait www. à partir d'une URL, tout en maintenant le chemin d'accès peut être réalisé simplement en utilisant:
En revanche, l'ajout www. au début de toute URL qui ne l'est pas déjà, il peut être réalisé par:
<= 3
, veuillez voir les autres réponses dans ce thread.constraints subdomain: false
, c'est en fait deux redirections pour une raison quelconque et se termine danswww.www.localhost:3000
. Dans le navigateur, je peux le voir redirigélocalhost:3000
=>www.localhost:3000
=>www.www.localhost:3000
localhost
etwww.localhost
n'ont pas de sous-domaines.any: /.*/
est documenté, parce que c'est de l'or.Il y a une meilleure approche si vous êtes à l'aide de Rails 3. Il suffit de prendre avantage de la gamme awesomeness.
"#{params[:protocol]}://#{params[:host]}/#{params[:path]}"
?J'aime vraiment utiliser les Rails Routeur pour de telles choses. Les réponses précédentes sont bonnes, mais je voulais quelque chose de plus général, que j'pouvez utiliser pour toute url qui commence par "www".
Je pense que c'est une bonne solution:
Prendre un coup d'oeil à cette middleware, il convient de faire précisément ce que vous voulez:
http://github.com/iSabanin/www_ditcher
Laissez-moi savoir si cela a fonctionné pour vous.
Une version d'une ligne de Duc de la solution. Il suffit d'ajouter à la haut de routes.rb
Dans Rails 3
Si vous souhaitez rediriger le domaine de premier niveau (TLD) pour le sous-domaine www, utilisez ce code:
Remarque: Ce code, l'utilisation de sous, pas gsub, c'est parce que l'remplace la première occurrence de la double anti-slash où gsub de remplacer tous les doubles barres obliques.
Pour les Rails 4 les solutions ci-dessus peuvent être ajoutés avec le Verbe de la construction par exemple
via: [:get, :post]
. Le duc de la solution devient:Rien de mal avec les approches ci-dessus, mais il ya aussi un couple de pierres précieuses qui fournissent middleware Rack pour ce faire.
J'aime la façon dont ils gardent ce comportement distinct à partir de l'application elle-même, mais ce n'est pas une dispute particulièrement violente de toute façon. J'ai aussi utiliser un middleware pour ce faire, lorsque l'on travaille avec Sinatra, donc préférez utiliser une technique que je peux utiliser sur les applications sont construites à partir de Rails et/ou Sinatra (j'ai souvent courir Nesta incorporé dans les Rails).
De toute façon, ils sont ici:
La première est plus simple (et celui que j'ai utilisé), alors que le deuxième offre un couple plus de fonctionnalités (que je ne suis pas encore besoin, mais ils apprécient).