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").

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top