Почему я теряю сессию при работе с доменным именем, обозначенным пунктиром (example-dashed.com)?

#ruby-on-rails #ruby #session

#ruby-on-rails #ruby #сессия

Вопрос:

У меня есть веб-сайт, который www.abrisud.com. На этом веб-сайте есть 7 доменных имен (по одному для каждого языка): abrisud.com, abrisud.it, abrisud.de и т.д. … и abrisud-enclosure.co.uk.

Проблема в последнем: я теряю сеанс при каждом отдельном запросе. Каждый раз, когда я загружаю страницу, у меня другой идентификатор сеанса. На других доменах все работает просто отлично.

Веб-сайт работает под управлением ruby 1.8.7 и rails 3.0.0.

Я действительно убежден, что проблема возникает из-за «-» в доменном имени, но я просто не могу найти ничего (или почти ничего) по этому вопросу через Интернет.

Надеюсь, я выражаюсь достаточно ясно, если нет, просто скажите мне.

Комментарии:

1. Может ли быть опечатка с подчеркиванием вместо этого? abrisud_enclosure.co.uk действительно приведет к удалению файлов cookie, поскольку это недопустимое доменное имя; тире ( - ) обычно должно работать нормально.

2. Кажется, у меня были проблемы с некоторыми версиями IE и доменными именами с пунктиром. Вы пробовали несколько браузеров?

3. @Piskvor : Это не опечатка, доменное имя abrisud-enclosure.co.uk Я знаю, что проблема известна с подчеркиванием, но я получил ее с помощью тире … 🙁

4. @jeremy : Я уже пробовал в chrome 12 и firefox 4, и проблема одинакова в обоих.

5. @Olivier de Robert: Спасибо за разъяснение, это действительно странно. (о, и действительно ли это тире ASCII (шестнадцатеричное 0x2D )? (домен разрешается, так что, вероятно, да; возможно ли вообще зарегистрировать домен с помощью em-dash?))

Ответ №1:

Вот ответ :

Из модуля ActionDispatch::Http::URL (Rails 3.0.x), обязательно прочитайте комментарии 😉

 # Returns the domain part of a host, such as "rubyonrails.org" in "www.rubyonrails.org". 
# You can specify a different <tt>tld_length</tt>, such as 2 to catch rubyonrails.co.uk in "www.rubyonrails.co.uk".
def domain(tld_length = 1)
  return nil unless named_host?(host)

  host.split('.').last(1   tld_length).join('.')
end
  

Ответ №2:

Что ж, вызов метода domain с соответствующим аргументом _tld_lenght_ не сработал, запрос.domain (abrisud-enclosure.co.uk ) было хорошо, но не session_domain (все еще co.uk ).

Итак, мне пришлось добавить следующие строки в качестве фильтра before в мой application_controller :

 def set_session_domain
  request.session_options[:domain] = request.domain
end
  

Если у вас есть решение получше, я открыт для него, поскольку я думаю, что это действительно грязное исправление.

Спасибо

Ответ №3:

Я достиг максимума на вашем сайте, файл cookie установлен с помощью: domain=co.uk;путь=/

Итак, проблема в вашем стеке rails, а не в браузерах — время выполнить некоторую отладку 🙂

Комментарии:

1. Спасибо за ваш ответ, я изучаю это прямо сейчас и сообщаю вам как можно скорее. Пока я не нашел набор файлов cookie с domain=co.uk.