Pour une raison quelconque, le remplacement :all
par le domaine n'a pas fonctionné (rails 3.2.11) pour moi. Il a fallu un morceau de middleware personnalisé pour le réparer. Un résumé de cette solution est ci-dessous.
tl; dr: Vous devez écrire un middleware de rack personnalisé. Vous devez l'ajouter dans votre fichier conifg/environments/[production|development].rb
. C'est sur Rails 3.2.11
Les sessions de cookies sont généralement stockées uniquement pour votre domaine de premier niveau.
Si vous regardez dans Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Vous pouvez voir qu'il y aura des entrées séparées pour sub1.yourdomain.com
et othersub.yourdomain.com
etyourdomain.com
Le défi consiste à utiliser le même fichier de stockage de session dans tous les sous-domaines.
Étape 1: Ajouter une classe middleware personnalisée
C'est là qu'intervient Rack Middleware . Quelques ressources pertinentes sur les racks et les rails:
Voici une classe personnalisée que vous devriez ajouter dans le lib
Ceci a été écrit par @Nader et vous devriez tous le remercier
# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
def initialize(app, default_domain)
@app = app
@default_domain = default_domain
end
def call(env)
host = env["HTTP_HOST"].split(':').first
env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
@app.call(env)
end
def custom_domain?(host)
host !~ /#{@default_domain.sub(/^\./, '')}/i
end
end
En gros, cela mappera toutes les données de votre session de cookies sur le même fichier de cookies qui est égal à votre domaine racine.
Étape 2: Ajouter à la configuration des rails
Maintenant que vous avez une classe personnalisée dans lib, assurez-vous de la charger automatiquement. Si cela ne vous dit rien, regardez ici: Rails 3 autoload
La première chose à faire est de vous assurer que vous utilisez un magasin de cookies à l'échelle du système. Dans config/application.rb
nous disons à Rails d'utiliser un magasin de cookies.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
La raison pour laquelle cela est mentionné ici est à cause de la :domain => :all
ligne. D'autres personnes ont suggéré de spécifier :domain => ".yourdomain.com"
au lieu de:domain => :all
. Pour une raison quelconque, cela n'a pas fonctionné pour moi et j'avais besoin de la classe Middleware personnalisée comme décrit ci-dessus.
Puis dans votre config/environments/production.rb
ajout:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Notez que le point précédent est nécessaire. Voir « cookies de sous-domaine, envoyés dans une demande de domaine parent? » Pour savoir pourquoi.
Puis dans votre config/environments/development.rb
ajout:
config.middleware.use "CustomDomainCookie", ".lvh.me"
L'astuce lvh.me est mappée sur localhost. C'est génial. Voir ce Railscast sur les sous - domaines et cette note pour plus d'informations.
J'espère que cela devrait le faire. Honnêtement, je ne suis pas tout à fait sûr de savoir pourquoi le processus est si compliqué, car je pense que les sites de sous-domaines croisés sont courants. Si quelqu'un a d'autres informations sur les raisons de chacune de ces étapes, veuillez nous éclairer dans les commentaires.