Ко мне обратился программист, говорит, мол, не могу понять, почему не работает система авторизации на странице и не запоминает данные логин и пароль после ввода пользователем. Причём не работает, только в отдельных браузерах.
Столкнулся с такой проблемой – на одном и том же PHP-скрипте, но при заходе с разных браузеров, не работал механизм сессий. Так как программное обеспечение пишем кроссбраузерное, то и проверяем один и тот же функционал на разных браузерах и различных конфигурациях сервера. Я вылил на свой хост его скрипт и начал разбираться, в чём дело, но у меня всё работало отлично, данные авторизации успешно сохранялись. Тогда попробовал на другом виртуальном хосте, где были проблемы, и обнаружил, что у меня тоже не работает в Internet Explorer и Safari, хотя при этом Firefox, а так же Opera успешно держали сессию.
Решил, что дело просто в разных настройках браузеров, и что они не сохраняют для отдельных хостов cookie. Всё тщательно перепроверил, но дело было не в этом. Установил себе сниффер и перехватил HTTP заголовки запросов к серверу и его ответов для каждого из браузеров. Для всех вариантов заголовок Set-Cookie имел правильное значение идентификатора сессии PHPSESSID, но IE и Safari упорно не хотели его держать и каждый раз при обращении к серверу он выдавал им новый идентификатор.
Так как сервер был один и тот же для тестирования и стоял у нас локально, а различие было лишь в именах виртуальных хостов, то пошёл к нашему системному администратору, на что тот пожал плечами и сказал что настройки для обоих виртуальных хостов одинаковые. И тут меня осенило, я увидел, что доменное имя виртуального хоста в первом случае содержит подчёркивание «_» в имени, а во втором нет. Это доменное имя было составлено не по стандарту RFC1035 (Domain names - implementation and specification). Отсюда и нерабочий механизм сессий, и отсутствие сохранения cookies в браузере.
Мораль сей басни такова. Этот яркий пример ещё раз показывает, что браузеры Firefox и Opera жёстко соблюдают стандарты, но при этом умеют работать даже в нештатных ситуациях. А Internet Explorer и Safari жутко капризны, перестают работать или интерпретируют код неправильно, даже при малейших отклонениях от стандартов. Будьте внимательны.
Кстати, забыл упомянуть, чтобы включить механизм сессий и хранение идентификатора PHPSESSID в cookie, необходимо в файле .htaccess прописать следующие флаги:
ОтветитьУдалитьphp_flag session.use_trans_sid off
php_flag session.use_only_cookies on