Почему-то :all
у меня не работала замена на домен (rails 3.2.11). Чтобы исправить это, потребовалось специальное промежуточное ПО. Краткое изложение этого решения приведено ниже.
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. Добавьте собственный класс промежуточного программного обеспечения
Вот здесь-то и пригодится 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
В основном это то, что он отображает все данные вашего сеанса cookie обратно в тот же файл cookie, который совпадает с вашим корневым доменом.
Шаг 2: добавляем в конфигурацию Rails
Теперь, когда у вас есть собственный класс в lib, убедитесь, что он загружается автоматически. Если это ничего не значило для вас, посмотрите здесь: Автозагрузка Rails 3
Во-первых, убедитесь, что вы используете хранилище файлов cookie для всей системы. В config/application.rb
мы говорим Rails использовать куки - магазин.
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
Причина, по которой это здесь упоминается, заключается в :domain => :all
строке. Есть и другие люди, которые предложили указать :domain => ".yourdomain.com"
вместо :domain => :all
. По какой-то причине у меня это не сработало, и мне понадобился настраиваемый класс промежуточного программного обеспечения, как описано выше.
Затем в вашем 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 о субдоменах и эту заметку для получения дополнительной информации.
Надеюсь, это должно сработать. Честно говоря, я не совсем уверен, почему этот процесс такой запутанный, поскольку я считаю, что сайты с перекрестными поддоменами являются обычным явлением. Если у кого-то есть какие-либо дополнительные сведения о причинах каждого из этих шагов, сообщите нам об этом в комментариях.