Đối với một số lý do thay thế :all
bằng miền không hoạt động (rails 3.2.11) đối với tôi. Phải mất một phần Trung gian tùy chỉnh để sửa chữa nó. Dưới đây là tóm tắt về giải pháp đó.
tl; dr: Bạn cần viết Phần mềm Trung gian Rack tùy chỉnh. Bạn cần thêm nó vào của bạn conifg/environments/[production|development].rb
. Đây là trên Rails 3.2.11
Các phiên cookie thường chỉ được lưu trữ cho miền cấp cao nhất của bạn.
Nếu bạn nhìn vào Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}
Bạn có thể thấy rằng sẽ có các mục nhập riêng biệt cho sub1.yourdomain.com
và othersub.yourdomain.com
vàyourdomain.com
Thách thức là sử dụng cùng một tệp lưu trữ phiên trên tất cả các miền phụ.
Bước 1: Thêm lớp phần mềm trung gian tùy chỉnh
Đây là nơi Rack Middleware xuất hiện. Một số tài nguyên về rack & rails có liên quan:
Đây là một lớp tùy chỉnh mà bạn nên thêm vào. lib
Điều này được viết bởi @Nader và tất cả các bạn nên cảm ơn anh ấy
# 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
Về cơ bản điều này làm được là nó sẽ ánh xạ tất cả dữ liệu phiên cookie của bạn trở lại vào cùng một tệp cookie chính xác bằng với miền gốc của bạn.
Bước 2: Thêm vào cấu hình Rails
Bây giờ bạn có một lớp tùy chỉnh trong lib, hãy đảm bảo rằng bạn đang tự động tải nó. Nếu điều đó không có ý nghĩa gì với bạn, hãy xem tại đây: Tự động tải về Rails 3
Điều đầu tiên là đảm bảo rằng bạn đang sử dụng kho cookie trên toàn hệ thống. Trong config/application.rb
chúng tôi yêu cầu Rails sử dụng kho cookie.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Lý do điều này ở đây được đề cập ở đây là vì :domain => :all
dòng. Có những người khác đã đề nghị chỉ định :domain => ".yourdomain.com"
thay vì :domain => :all
. Vì một số lý do, điều này không hoạt động với tôi và tôi cần lớp Middleware tùy chỉnh như được mô tả ở trên.
Sau đó, trong config/environments/production.rb
phần bổ sung của bạn :
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
Lưu ý rằng dấu chấm trước đó là cần thiết. Xem " cookie tên miền phụ, được gửi trong yêu cầu tên miền mẹ? " Để biết lý do.
Sau đó, trong config/environments/development.rb
phần bổ sung của bạn :
config.middleware.use "CustomDomainCookie", ".lvh.me"
Thủ thuật lvh.me ánh xạ vào localhost. Thật tuyệt vời. Xem Railscast này về tên miền phụ và ghi chú này để biết thêm thông tin.
Hy vọng rằng điều đó nên làm điều đó. Thành thật mà nói, tôi không hoàn toàn chắc chắn tại sao quá trình này lại phức tạp, vì tôi cảm thấy các trang web tên miền phụ chéo là phổ biến. Nếu bất kỳ ai có thêm hiểu biết về lý do đằng sau mỗi bước này, vui lòng cho chúng tôi biết trong phần bình luận.