Apr 01, 2011 12:30
Вчера был на грани потери веры в б-га, силы природы и логики. После того как успешно протестировал один из интернет-проектов в браузере Opera, принялся за его же тестирование в браузере Windows Internet Explorer; обломался сразу - не работает авторизация основанная на использовании механизма сессий. Никаких ошибок не возвращает, но и не логинится. В Опере всё работает, а в Эксплорере нет. Как так? Обычно разница браузеров сводится к разночтениям в html-разметке и работе JS, но авторизация - серверная сторона.
Путём научного тыка установлено, что виновата во всём сессия, которая постоянно ре-стартует затирая уже установленные значения нужных переменных.
Исходный код:
session_start();
print session_id();
?>
в Опере по обновлению всегда отображал одно и тоже значение ИД сессии (что и должен был делать, ибо session_start сначала проверяет текущее состояние сессии и лишь потом стартует, если требуется), а в Эксплорере на каждом обновлении всегда выводил новый ИД.
Получилась следующая картина:
1. есть два проекта, условно proj и proj_2 (форк от предыдущего)
2. Apache настроен на два виртуальных хоста proj и proj_2
3. в Опере всё валидно работает в обоих проектах
4. в Эксплорере proj работает нормально, proj_2 творит чудеса.
Решение проблемы подсказала жена - оказывается Эксплорер некорректно обрабатывает символ "_" в имени хоста, что и перезапускает сессию. Переименование в proj2 устранило проблему :)
П.С.: собственно в RFC 1738 (Uniform Resource Locators (URL)) определено, что доменное имя может состоять только из букв, цифр и тире ("-"). Но доменное имя и имя хоста - не одно и тоже, RFC 1033 (DOMAIN OPERATIONS GUIDE) разрешает в имени хоста использовать буквы, цифры, тире и подчёркивание ("_"). Итак, мы снова убедились, что Интернет Эксплорер - плохой глючный браузер.
П.П.С.: версии браузеров: Opera 10.11, Windows Internet Explorer 8.0