Per qualche motivo la sostituzione :all
con il dominio non ha funzionato (rails 3.2.11) per me. Ci è voluto un pezzo di middleware personalizzato per risolverlo. Di seguito è riportato un riepilogo di tale soluzione.
tl; dr: è necessario scrivere un middleware per rack personalizzato. Devi aggiungerlo al tuo file conifg/environments/[production|development].rb
. Questo è su Rails 3.2.11
Le sessioni cookie vengono solitamente memorizzate solo per il tuo dominio di primo livello.
Se guardi in Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Puoi vedere che ci saranno voci separate per sub1.yourdomain.com
e othersub.yourdomain.com
eyourdomain.com
La sfida è utilizzare lo stesso file di archivio di sessione in tutti i sottodomini.
Passaggio 1: aggiungere una classe middleware personalizzata
È qui che entra in gioco il Rack Middleware . Alcune risorse rilevanti per rack e binari:
Ecco una classe personalizzata che dovresti aggiungere in lib
Questo è stato scritto da @Nader e dovresti ringraziarlo tutti
# 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
Fondamentalmente ciò che fa è che mapperà tutti i dati della sessione dei cookie sullo stesso identico file cookie che è uguale al tuo dominio principale.
Passaggio 2: Aggiungi a Rails Config
Ora che hai una classe personalizzata in lib, assicurati di caricarla automaticamente. Se che nulla significato per te, un'occhiata qui: Rails 3 autoload
La prima cosa è assicurarsi di essere a livello di sistema utilizzando un cookie store. In config/application.rb
diciamo a Rails di utilizzare un cookie store.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Il motivo per cui questo è qui è menzionato qui è a causa della :domain => :all
linea. Ci sono altre persone che hanno suggerito di specificare :domain => ".yourdomain.com"
invece di :domain => :all
. Per qualche motivo questo non ha funzionato per me e avevo bisogno della classe Middleware personalizzata come descritto sopra.
Quindi nella tua config/environments/production.rb
aggiunta:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Notare che il punto precedente è necessario. Vedi " cookie di sottodominio, inviati in una richiesta di dominio padre? " Per il motivo.
Quindi nella tua config/environments/development.rb
aggiunta:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Il trucco lvh.me si mappa su localhost. È meraviglioso. Vedi questo Railscast sui sottodomini e questa nota per maggiori informazioni.
Si spera che dovrebbe farlo. Onestamente non sono del tutto sicuro del motivo per cui il processo è così contorto, poiché ritengo che i siti di sottodomini incrociati siano comuni. Se qualcuno ha ulteriori informazioni sui motivi alla base di ciascuno di questi passaggi, ti preghiamo di chiarirci nei commenti.