Aus irgendeinem Grund :allfunktionierte das Ersetzen durch die Domain bei mir nicht (Rails 3.2.11). Es dauerte ein Stück benutzerdefinierte Middleware, um das Problem zu beheben. Eine Zusammenfassung dieser Lösung finden Sie unten.
tl; dr: Sie müssen eine benutzerdefinierte Rack-Middleware schreiben. Sie müssen es in Ihre hinzufügen conifg/environments/[production|development].rb. Dies ist auf Schienen 3.2.11
Cookie-Sitzungen werden normalerweise nur für Ihre Top-Level-Domain gespeichert.
Wenn Sie nachsehen, Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}können Sie sehen, dass es separate Einträge für sub1.yourdomain.comund othersub.yourdomain.comund gibtyourdomain.com
Die Herausforderung besteht darin, in allen Subdomänen dieselbe Sitzungsspeicherdatei zu verwenden.
Schritt 1: Fügen Sie eine benutzerdefinierte Middleware-Klasse hinzu
Hier kommt Rack Middleware ins Spiel . Einige relevante Rack & Rails-Ressourcen:
Hier ist eine benutzerdefinierte Klasse, die Sie hinzufügen sollten. lib
Dies wurde von @Nader geschrieben und Sie alle sollten ihm danken
# 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
Im Grunde bedeutet dies, dass alle Ihre Cookie-Sitzungsdaten wieder genau derselben Cookie-Datei zugeordnet werden, die Ihrer Stammdomäne entspricht.
Schritt 2: Zu Schienen hinzufügen Konfiguration
Nachdem Sie eine benutzerdefinierte Klasse in lib haben, stellen Sie sicher, dass diese automatisch geladen wird. Wenn Ihnen das nichts bedeutet hat, schauen Sie hier: Rails 3 Autoload
Stellen Sie zunächst sicher, dass Sie mithilfe eines Cookie-Speichers systemweit sind. In config/application.rbsagen wir Rails, dass sie einen Cookie-Laden benutzen sollen.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Der Grund, warum dies hier erwähnt wird, liegt in der :domain => :allLinie. Es gibt andere Personen, die vorgeschlagen haben, :domain => ".yourdomain.com"anstelle von anzugeben:domain => :all . Aus irgendeinem Grund funktionierte dies bei mir nicht und ich benötigte die benutzerdefinierte Middleware-Klasse wie oben beschrieben.
Dann config/environments/production.rbfügen Sie hinzu:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Beachten Sie, dass der vorhergehende Punkt erforderlich ist. Weitere Informationen finden Sie unter " Subdomain-Cookies, die in einer übergeordneten Domain-Anfrage gesendet wurden? ".
Dann config/environments/development.rbfügen Sie hinzu:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Der Trick lvh.me wird auf localhost abgebildet. Es ist toll. Weitere Informationen finden Sie in diesem Railscast zu Subdomains und in diesem Hinweis .
Hoffentlich sollte es das tun. Ich bin mir ehrlich gesagt nicht ganz sicher, warum der Prozess so kompliziert ist, da ich der Meinung bin, dass Cross-Subdomain-Sites häufig sind. Wenn jemand weitere Einblicke in die Gründe für jeden dieser Schritte hat, klären Sie uns bitte in den Kommentaren auf.