ด้วยเหตุผลบางอย่างการแทนที่:all
ด้วยโดเมนไม่ได้ผล (ราง 3.2.11) สำหรับฉัน ต้องใช้มิดเดิลแวร์ที่กำหนดเองส่วนหนึ่งในการแก้ไข สรุปวิธีแก้ปัญหานั้นอยู่ด้านล่าง
tl; dr:คุณต้องเขียน Rack Middleware ที่กำหนดเอง คุณต้องเพิ่มลงในconifg/environments/[production|development].rb
ไฟล์. นี่คือบน Rails 3.2.11
โดยปกติเซสชันคุกกี้จะถูกเก็บไว้สำหรับโดเมนระดับบนสุดของคุณเท่านั้น
หากคุณดูในChrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
คุณจะเห็นว่าจะมีรายการแยกต่างหากสำหรับsub1.yourdomain.com
และothersub.yourdomain.com
และyourdomain.com
ความท้าทายคือการใช้ไฟล์เก็บเซสชันเดียวกันในโดเมนย่อยทั้งหมด
ขั้นตอนที่ 1: เพิ่มคลาสมิดเดิลแวร์ที่กำหนดเอง
นี่คือที่มาของRack Middlewareทรัพยากรชั้นวางและรางที่เกี่ยวข้อง:
นี่คือคลาสแบบกำหนดเองที่คุณควรเพิ่มในสิ่งlib
นี้เขียนโดย@Naderและคุณทุกคนควรขอบคุณเขา
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
โดยพื้นฐานแล้วสิ่งนี้คือการแมปข้อมูลเซสชันคุกกี้ทั้งหมดของคุณกลับไปยังไฟล์คุกกี้เดียวกันทั้งหมดที่มีค่าเท่ากับโดเมนรากของคุณ
ขั้นตอนที่ 2: เพิ่มในการกำหนดค่าราง
ตอนนี้คุณมีคลาสที่กำหนดเองใน lib แล้วตรวจสอบให้แน่ใจว่าได้โหลดอัตโนมัติแล้ว หากนั่นไม่มีความหมายสำหรับคุณโปรดดูที่นี่: Rails 3 autoload
สิ่งแรกคือตรวจสอบให้แน่ใจว่าคุณใช้งานที่เก็บคุกกี้ทั้งระบบ ในconfig/application.rb
เราบอกทางรถไฟที่จะใช้เก็บคุกกี้
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
เหตุผลที่กล่าวถึงที่นี่เป็นเพราะ:domain => :all
เส้น มีคนอื่น ๆ ที่มีข้อเสนอแนะในการระบุเป็นแทน:domain => ".yourdomain.com"
:domain => :all
ด้วยเหตุผลบางประการสิ่งนี้ไม่ได้ผลสำหรับฉันและฉันต้องการคลาส Middleware ที่กำหนดเองตามที่อธิบายไว้ข้างต้น
จากนั้นในการconfig/environments/production.rb
เพิ่มของคุณ:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
โปรดทราบว่าจุดก่อนหน้าเป็นสิ่งที่จำเป็น ดู " คุกกี้โดเมนย่อยที่ส่งในคำขอโดเมนหลักหรือไม่ " สำหรับสาเหตุ
จากนั้นในการconfig/environments/development.rb
เพิ่มของคุณ:
config.middleware.use "CustomDomainCookie", ".lvh.me"
แผนที่เคล็ดลับ lvh.me เข้าสู่ localhost มันเจ๋งมาก. ดูRailscast เกี่ยวกับโดเมนย่อยและหมายเหตุนี้สำหรับข้อมูลเพิ่มเติม
หวังว่าน่าจะทำได้นะ ฉันไม่แน่ใจจริงๆว่าทำไมกระบวนการนี้จึงซับซ้อนเนื่องจากฉันรู้สึกว่าไซต์ข้ามโดเมนย่อยเป็นเรื่องปกติ หากใครมีข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับเหตุผลเบื้องหลังแต่ละขั้นตอนเหล่านี้โปรดแจ้งให้เราทราบในความคิดเห็น