Rediriger 'myapp.com' vers 'www.myapp.com' dans des rails sans utiliser htaccess?
-
11-07-2019 - |
Question
Utiliser 'Appspace de Morph Labs pour déployer un site ne signifie aucun moyen automatisé de rediriger' myapp.com 'vers' www.myapp.com '(et aucun accès à .htacess).
Existe-t-il un moyen de faire cela dans les rails? Aurais-je besoin d'un plugin tel que sous-domaine-fu ?
Plus précisément, j'essaie de faire quelque chose comme:
- 'myapp.com' = > "www.myapp.com"
- 'myapp.com/session/new' = > "www.myapp.com/session/new"
En gros, je veux toujours que le sous-domaine "www" soit ajouté à chaque requête (car le certificat SSL porte précisément le nom "www.myapp.com").
La solution
Peut-être que quelque chose comme ceci ferait l'affaire:
class ApplicationController < ActionController::Base
before_filter :check_uri
def check_uri
redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
end
end
Autres conseils
La réponse de Carson fonctionne très bien.
Voici le code pour aller dans l'autre sens (www - > no www)
before_filter :check_uri
def check_uri
if /^www/.match(request.host)
redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri
end
end
J'ai dû changer la réponse de Carson pour que cela fonctionne dans Rails 3. J'ai remplacé request.uri par request.fullpath:
class ApplicationController < ActionController::Base
protect_from_forgery
Rails.env.production? do
before_filter :check_url
end
def check_url
redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
end
end
Cela a très bien fonctionné pour moi. J'ai fait un petit ajout car je ne voulais que ce comportement dans mon environnement de production:
def check_uri
redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end
Je sais que la réponse est trouvée, mais j’ai pensé que tout le monde devrait connaître la solution CodeRack: Canonical Host. C'est vraiment sympa car cela permet des redirections spécifiques à env. http://coderack.org/users/tylerhunt/middlewares/6-canonical- hôte
Voici deux manières différentes:
head :moved_permanently, :location => ‘http://www.newdomain.com’
un autre:
def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end
Pour ceux d'entre vous qui souhaitent également forcer SSL avec heroku, cela a bien fonctionné pour moi, sur la base de Heroku SSL sur le domaine racine
Dans mes paramètres DNS, j'ai configuré une adresse URL / transfert (DNS simple)
URL foo.com 3600 http://www.foo.com
La configuration de CNAME doit uniquement être configurée pour WWW
CNAME www.foo.com 3600 providedssslendpoint.herokussl.com
J'ai également dû configurer et alias pour ma racine
ALIAS foo.com 3600 providedsslendpoint.herokussl.com
Ensuite, j'ai décidé de simplement remplacer foo.com par une variable env ENV ['SITE_HOST']
(où SITE_HOST pourrait correspondre à www.foo.com ou à test.foo .com) afin que je puisse avoir le contrôle via ma configuration heroku. De cette façon, je peux contrôler ce qui se passe dans différents environnements. (pour configurer localement des variables env, voir https://github.com/bkeepers/dotenv )
Par exemple, mon application de test utilise test.foo.com comme URL, elle possède également son propre point de terminaison SSL, ce qui me convient parfaitement.
before_filter :check_domain
def check_domain
if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
end
end
À partir de maintenant, les utilisateurs finaux accéderont toujours à www avec SSL forcé. Les liens anciens subiront un léger blocage, mais rien d’observable