Двухбуквенные домены и ИЕ
Про проблему с двухбуквенными доменами в браузере Микрософта знают наверное, очень многие. Если вкратце, считается, что на двухбуквенных доменах второго уровня «Эксплорер» не ставит куки.
Отчасти так оно и есть.
Сделано это вот для чего. Некоторые страны (например, Великобритания) запрещают регистацию домена второго уровня для своих нужд, домен должен находиться на третьем уровне в зоне специальных доменов второго уровня. Если бы я родился и жил в Лондоне, мой блог мог бы располагаться по адресу bolknote.co.uk.
Вот отсюда и родилось это ограничение — так как на домене третьего уровня в некоторых странах располагается куча чужих друг другу сайтов, они могли бы читать и писать куки друг друга через общий домен (и воровать данные авторизации, например), но браузеры не озаботились механизмом предотвращения этой угрозы.
В «Экплорере» (скорее всего это произошло в шестой версии) защиту устроили просто — если в домене второго уровня две буквы и он не располагается на домене общего назначения (.com, .net и т. п.), то это специальный домен из вышеописанного случая и ставить куку на него нельзя.
Но тогда как же, чёрт возьми, поступает «Яндекс» со своих двухбуквенным «ya.ru»? Есть
Разочарую — её нет, есть исключения.
Ребята из «Микрософта» через

Т. е. если домен встречается в теге «tld» или содержит только две буквы на втором уровне, то куку ставить нельзя, но если он встретился в теге «domain» — то можно. Посмотрите на скриншот, домен «Яндекса» содержится в списке исключений. Естественно, список может меняться при обновлении браузера.
Остальным браузерам так же приходится решать эту проблему. Например, ФФ содержит примерно такой же список:
# примерное количество значений в этом списке у ФФ:
bolk@Bolk ~ $ grep -aF chel.ru /Applications/Firefox.app/Contents/MacOS/XUL | strings | fgrep . | fgrep -v / | sort -u | wc -l
4019
# двадцать последних (по алфавиту) значений:
bolk@Bolk ~ $ grep -aF chel.ru /Applications/Firefox.app/Contents/MacOS/XUL | strings | fgrep . | fgrep -v / | sort -u | tail -20
z.bg
z.se
za.com
za.net
za.org
zachpomor.pl
zagan.pl
zakopane.pl
zaporizhzhe.ua
zarow.pl
zgora.pl
zgorzelec.pl
zgrad.ru
zhitomir.ua
zj.cn
zlg.br
zoological.museum
zoology.museum
zp.ua
zt.uaНе знаю все ли четыре тысячи относятся к обсуждаемому списку (кстати, в нём всего 133 российских домена), но такой список точно существует.
Тот же список есть и в «Хроме» (на моём «Маке» он содержится в файле «Google Chrome Framework» и состоит из более 3,5 тысяч значений), в «Сафари» ничего похожего я обнаружить не смог, то ли такого механизма там нет, то ли спрятано глубже, чем мне позволяет искать моя лень. «Опера» держит свой список в файле «public_domains.dat», в нём на настоящий момент 4291 значение.
Таким образом, если вы владелец двухбуквенного домена и вам не повезло, у вас не работают куки как положено, пишите на адреса техподдержки производителей браузеров, а пока делайте редирект на домен третьего уровня (например, на «www»).
Комментарии 28
Видимо они не заморачиваются с установкой кук на корневой домен:
Да, нерегулярно. Вот к примеру лог изменений этого списка в Chromium http://src.chromium.org/viewvc/chrome/trun … t?view=log
Последнее изменение датируется 2 ноября прошлого года
Тут все выглядит получше.
ээ почему вы так считаете?
Зачем, спрашивается,
Не только британцы этим страдают. Минимум три домена — uk, us и nl. nl вообще один из первых национальных доменов, возможно тогда так принято было.
Что касается «IE не ставит» — это тоже не совсем так. Он не ставит куку, если видит заголовок
Нет в IE проблем со всеми доменами, я об этом целую заметку написал.
Нет, это не так. Исключения там тоже есть. Они начинаются с восклицательного знака, например:
-
Сомневаюсь, что это так. Иначе неясно с чего бы «Яндекс» указывал домен на ya.ru:
Для лучшего понимания контекста — я тот человек, по вопросу которого на хабре ты эту запись написал.
В оригинальном вопросе на хабре ( http://habrahabr.ru/qa/21647/ ) как раз немного обсуждается, как оно работает.
Ок, со всеми двухсимвольными, кроме исключений.
Насколько я понимаю, они начинаются с восклицательного знака, отменяя наложенное ранее «широкое» правило из этого же списка.
Т.е. СНАЧАЛА *.ar — все домены второго уровня в TLD ar объявляются «публичными» (куку не ставить), а потом !educ.ar — отменяет это правило. Т.е. это не «исключения», о которых я говорил. Public Suffix List содержит список «куда не ставить» и браузеры, которые им пользуются — не имеют других соображений о том «куда не ставить», в отличие от IE.
Можно в комментариях мои слова прочитать — у меня как раз пара двухсимвольных доменов есть.
Да собственно можешь сам попробовать — http://66.ru/test/iframe/index.php ифреймы показывают текущие куки, а http://66.ru/test/iframe/index.php?set=bolk попробует поставить куку в разных вариантах. Можно так же позаходить на http://www.66.ru/test/iframe/index.php и http://other.66.ru/test/iframe/index.php и попробовать поставить куки оттуда разными браузерами.
Яндекс указывает домен на .ya.ru (на не на ya.ru) потому что ya.ru в списке исключений IE и работает как любой другой домен.
Кстати говоря, эта логика со времен шестого эксплорера довольно заметно изменилась — например в .gr и .pl современный IE соглашается ставить куки на любой двухсимвольный домен второго уровня.
А, нет, я слегка приврал. Логика не менялась со времени IE5. В IE8 добавили как раз список исключений.
Повторю лучше ссылку, которую уже постил на хабре — там всё про IE очень подробно написано.
Ага, спасибо за ссылки, буду экспериментировать как только найду
Комментарий для Данила:
В списке исключений он ведь только с восьмой версии. А есть ещё шестая и седьмая.
Странно ещё, что логика не должна была меняться с пятого по шестой IE, но при этом есть вот такая ссылка: http://support.microsoft.com/default.aspx? … S%3B310676 где говорится о проблемах с шестой версией.
Комментарий для Евгения Степанищева:
Судя по всему, Яндекс положил болт. В шестом IE при заходе на ya.ru — кука на ya.ru не ставится.
Ага, понятно.
Я поспрашивал ребят из «Яндекса», но найти того, кто владеет информацией про короткий домен непросто (в смысле на какой браузер забили).
к .com это не относится.
Прощу прощения, промахнулся.
В Сафари под виндой есть файл
C:\Program Files\Safari\Safari.resources\TopLevelDomains.plist
расшарил, кому интересно --
https://docs.google.com/open?id=0BzMtX0bME … mQxTlJ0Y0U
/System/Library/PrivateFrameworks/Safari.framework/Versions/A/Resources/TopLevelDomains.plist