З якихось причин заміна :all
на домен для мене не спрацювала (рейки 3.2.11). Щоб це виправити, знадобився спеціальний проміжний продукт. Короткий зміст цього рішення знаходиться нижче.
tl; dr: Вам потрібно написати власний Rack Middleware. Вам потрібно додати його до свого conifg/environments/[production|development].rb
. Це на Rails 3.2.11
Сеанси cookie зазвичай зберігаються лише для вашого домену верхнього рівня.
Якщо ви заглянете в 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, і ви всі повинні подякувати йому
# 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
По суті, це робить те, що він відображатиме всі ваші дані сеансів cookie назад у той самий файл cookie, який дорівнює вашому кореневому домену.
Крок 2: Додати до Rails Config
Тепер, коли у вас є власний клас у lib, переконайтеся, що ви завантажуєте його автоматично. Якщо це для вас нічого не означало, дивіться тут: Rails 3 autoload
Перше, що потрібно, щоб переконатись, що ти використовуєш загальносистемну систему, використовуючи магазин печива. В config/application.rb
ми говоримо Rails використовувати куки - магазин.
# We use a cookie_store for session data
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"
Зверніть увагу, що попередня крапка необхідна. Див. " Субдоменні файли cookie, надіслані в запиті батьківського домену? ", Щоб дізнатися, чому.
Потім у своєму config/environments/development.rb
додаванні:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Трюк lvh.me відображається на localhost. Це приголомшливо. Для отримання додаткової інформації див. Цей Railscast про субдомени та цю примітку .
Сподіваємось, це повинно це зробити. Я, чесно кажучи, не зовсім впевнений, чому процес такий заплутаний, оскільки я відчуваю, що сайти між субдоменами є загальними. Якщо хтось має подальше розуміння причин кожного з цих кроків, будь ласка, поясніть нам у коментарях.