Untuk beberapa alasan mengganti :all
dengan domain tidak berhasil (rel 3.2.11) untuk saya. Butuh Middleware kustom untuk memperbaikinya. Ringkasan solusi itu ada di bawah.
tl; dr: Anda perlu membuat Rack Middleware khusus. Anda perlu menambahkannya ke fileconifg/environments/[production|development].rb
. Ini ada di Rails 3.2.11
Sesi cookie biasanya disimpan hanya untuk domain level teratas Anda.
Jika Anda melihat di Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Anda dapat melihat bahwa akan ada entri terpisah untuk sub1.yourdomain.com
dan othersub.yourdomain.com
danyourdomain.com
Tantangannya adalah menggunakan file penyimpanan sesi yang sama di semua subdomain.
Langkah 1: Tambahkan Kelas Middleware Khusus
Di sinilah Rack Middleware berperan . Beberapa resource rack & rails yang relevan:
Berikut adalah kelas khusus yang harus Anda tambahkan di lib
Ini ditulis oleh @Nader dan Anda semua harus berterima kasih padanya
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
Pada dasarnya apa yang dilakukannya adalah memetakan semua data sesi cookie Anda kembali ke file cookie yang sama persis dengan domain root Anda.
Langkah 2: Tambahkan ke Konfigurasi Rails
Sekarang Anda memiliki kelas khusus di lib, pastikan sudah memuatnya secara otomatis. Jika itu tidak berarti apa-apa bagi Anda, lihat di sini: Pemuatan otomatis Rails 3
Hal pertama adalah memastikan bahwa Anda menggunakan penyimpanan cookie di seluruh sistem. Di config/application.rb
kami memberi tahu Rails untuk menggunakan penyimpanan cookie.
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Alasan mengapa hal ini disebutkan di sini adalah karena :domain => :all
garis. Ada orang lain yang menyarankan untuk menentukan :domain => ".yourdomain.com"
alih-alih :domain => :all
. Untuk beberapa alasan ini tidak berhasil untuk saya dan saya membutuhkan kelas Middleware kustom seperti yang dijelaskan di atas.
Kemudian di config/environments/production.rb
tambahkan:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Perhatikan bahwa titik sebelumnya diperlukan. Lihat " cookie sub-domain, dikirim dalam permintaan domain induk? " Untuk mengetahui alasannya.
Kemudian di config/environments/development.rb
tambahkan:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Trik lvh.me dipetakan ke localhost. Itu mengagumkan. Lihat Railscast tentang subdomain dan catatan ini untuk info lebih lanjut.
Mudah-mudahan itu harus dilakukan. Sejujurnya saya tidak sepenuhnya yakin mengapa proses ini berbelit-belit, karena saya merasa situs lintas subdomain adalah hal yang umum. Jika ada yang memiliki wawasan lebih jauh tentang alasan di balik masing-masing langkah ini, beri tahu kami di komentar.