Aus irgendeinem Grund :all
funktionierte 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.com
und othersub.yourdomain.com
und 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.rb
sagen 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 => :all
Linie. 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.rb
fü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.rb
fü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.