У меня есть настройка приложения, в которой каждый пользователь принадлежит компании, и у этой компании есть поддомен (я использую поддомены в стиле basecamp). Проблема, с которой я столкнулся, заключается в том, что rails создает несколько файлов cookie (один для lvh.me, а другой для subdomain.lvh.me), что вызывает довольно много сбоев в моем приложении (например, флэш-сообщения постоянны, хотя все запросы один раз Вошел).
У меня это есть в моем файле /cofig/initilizers/session_store.rb:
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
Домен:: все кажется стандартным ответом, который я нашел в Google, но, похоже, это не работает для меня. Любая помощь приветствуется!
источник
config.secret_key_base
во всех своих приложениях, иначе он не сможет декодировать cookie.CacheStore
для хранения сессий в memcached?Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/
Другими словами, вам необходимо:
App.config.session_store ... , :domain => :all, :tld_length => 2
Также неплохо очистить файлы cookie
источник
, :tld_length => 2
config.secret_key_base
во всех своих приложениях, иначе он не сможет декодировать cookie.:domain => :all
не будет работать в Rails 4, попробуйтеdomain => 'lvh.me', tld_length = 2
. Это сработало для меняdomain: :all, tld_length: 2
используяlvh.me
домен.Я искал способ решить эту проблему без явного указания имени домена, поэтому я мог переключаться между localhost, lvh.me и любыми доменами, которые я бы использовал в производстве, без необходимости продолжать редактировать файл session_store.rb. Однако установка "domain:: all", похоже, не сработала для меня.
В конечном итоге я обнаружил, что мне нужно указать tld_length (длину домена верхнего уровня) в этом выражении. По умолчанию tld_length равно 1, в то время как example.lvh.me имеет tld_length равное 2, а 127.0.0.1.xip.io, например, имеет tld_length равное 5. Итак, что у меня было в файле session_store.rb для поддоменов на lvh.me в разработке и всего остального в производстве, было ниже.
MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2
Надеюсь, это поможет кому-то, так как мне потребовалось много времени, чтобы найти этот ответ!
источник
Почему-то
: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, и вы все должны его поблагодарить# 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
Теперь, когда у вас есть собственный класс в lib, убедитесь, что он загружается автоматически. Если это ничего не значило для вас, посмотрите здесь: Автозагрузка Rails 3
Во-первых, убедитесь, что вы используете хранилище файлов cookie для всей системы. В
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
. По какой-то причине у меня это не сработало, и мне понадобился настраиваемый класс промежуточного программного обеспечения, как описано выше.Затем в вашем
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 о субдоменах и эту заметку для получения дополнительной информации.
Надеюсь, это должно сработать. Честно говоря, я не совсем уверен, почему этот процесс такой запутанный, поскольку я считаю, что сайты с перекрестными поддоменами являются обычным явлением. Если у кого-то есть какие-либо дополнительные сведения о причинах каждого из этих шагов, сообщите нам об этом в комментариях.
источник
config.secret_key_base
во всех своих приложениях, иначе он не сможет декодировать cookie.Я столкнулся с этим, когда искал простейший способ сделать cookie корневым доменом. Кажется, есть некоторая дезинформация об
:all
опции, когда она передается как опция домена. Для большинства доменов это действительно будет работать должным образом, установив cookie в корневой домен (например,.example.com
дляtest.example.com
). Я думаю, что у большинства людей возникли проблемы, поскольку они использовали доменlvh.me
для тестирования. Регулярное выражение, используемое rails для поиска домена верхнего уровня, определяется какDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/
. Если вы обратите внимание на последнюю часть, вы увидите, что rails интерпретируетсяlvh.me
как TLD, аналогичныйcom.au
. Если ваш вариант использования долженlvh.me
работать, этот:all
вариант не будет работать должным образом, однако он кажется самым простым и лучшим вариантом для большинства доменов.TL; DR, правильный ответ здесь, если вы не разрабатываете трехбуквенный домен (или любой домен, который сбивает с толку вышеуказанное регулярное выражение)
:all
.источник
Rails 4.x (также должно работать с версиями Rails 5/6)
Как получить lvh.me:3000 и поддомен в localhost (Rails)
Разработка: я предоставил доступ к файлам cookie для добавления
.lvh.me
вsession_store.rb
,Она будет разделена между поддоменами на локальном хосте
admin.lvh.me:3000
,lvh.me:3000
и так далее ...#config/initializers/session_store.rb domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me" Rails.application.config.session_store :cookie_store, key: '_app_name_session', domain: domain
источник
Ты пробовал
AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'
)
в основном мы говорим, что для базового домена нужно использовать один файл cookie и просто игнорировать субдомен ... хотя этот подход все еще имеет некоторые недостатки ...
источник
опорные рельсы5
если вы хотите, чтобы он работал с любым доменом:
Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2
Для настройки для каждой среды вы можете использовать следующее:
Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: { production: '.example.com', development: '.example.dev' }.fetch(Rails.env.to_sym, :all)
Ссылка: https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains
источник
Если вы используете Redis для хранилища сеансов.
if Rails.env.development? Rails.application.config.session_store :redis_store, { servers: [ { host: 'localhost', port: 6379}, ], key: '_app_session', expire_after: 1.day, domain: :all } else Rails.application.config.session_store :redis_store, { servers: [ { host: HOST_URL, port: PORT}, ], key: '_app_session', expire_after: 1.day, domain: '.domain.com', tld_length: 2 } end
источник