По какой-то причине это не сработало (rails 3.2.11) для любых данных сеанса, которые были установлены на поддомене. Для исправления потребовался кусок пользовательского Middleware. Краткое описание этого решения приведено ниже.
tl; dr: Вам необходимо написать специальное промежуточное программное обеспечение для стойки. Вы должны добавить его в свой 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. Добавление пользовательского класса промежуточного программного обеспечения
Здесь промежуточное программное обеспечение стойки . Некоторые соответствующие ресурсы стойки и рельсов:
Вот пользовательский класс, который вы должны добавить в lib
Это написал @ Надер и вы все должны поблагодарить его
# 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
Прежде всего, убедитесь, что вы используете систему cookie-файлов для всей системы. В config/application.rb
мы говорим Rails использовать хранилище cookie.
# 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"
Обратите внимание, что предыдущая точка необходима. См. " куки субдомена, отправленные в запросе родительского домена? ", почему.
Тогда в вашем config/environments/development.rb
добавьте:
config.middleware.use "CustomDomainCookie", ".lvh.me"
Трюк lvh.me отображается на localhost. Это круто См. этот Railscast о поддоменах и в этой заметке для получения дополнительной информации.
Надеюсь, это должно сделать это. Я, честно говоря, не совсем уверен, почему этот процесс настолько запутанный, так как я считаю, что сайты с поддоменами являются общими. Если у кого-либо есть какие-либо дополнительные сведения о причинах каждого из этих шагов, просим сообщить нам об этом в комментариях.