Undefined index: PHPSESSID – возможная причина

Подписаться на комментарии по RSS
Метки: |

Однажды, при переносе сайта с одного хостинга на другой, столкнулся с неожиданной проблемой – перестала работать капча. Т.е. при вводе корректного проверочного кода сайт мне сообщал, что код некорректный и предлагал ввести его снова. Стал разбираться.

В логах нашел что-то типа:

PHP Notice: Undefined index: PHPSESSID in /.../public_html/index.php on line 12

Я не специалист в PHP, но понял, что дело в сессиях. Упрощенно, капча у меня на сайте работает примерно так:

  1. Каждому посетителю сайта присваивается уникальный номер – назовем его PHPSESSID.
  2. Пользователь заходит на страничку, где используется капча. Сервер считывает его PHPSESSID, генерирует проверочный код для капчи и «привязывает» этот код к PHPSESSID.
  3. Пользователь заполняет форму, вводит проверочный код и отправляет форму.
  4. Сервер опять смотрит, какой у пользователя PHPSESSID, находит соответствующий этому PHPSESSID проверочный код и смотрит, совпадает ли он с кодом, который ввел пользователь. Если да – все ОК, если нет – ошибка.

После переезда оказалось, что переменная PHPSESSID, в которой должен содержаться уникальный код посетителя, пуста. Поэтому когда пользователь заходит на страничку, где используется капча, сервер генерирует проверочный код, но НЕ ПРИВЯЗЫВАЕТ его к PHPSESSID, т.к. у пользователя его нет. В итоге пользователь проверочный код видит, вводит – и всегда получает ошибку, т.к. сервер не знает, с чем сравнивать код, введенный пользователем.

Причина такого поведения оказалась проста. Сессионные переменные хранятся в глобальном массиве $_REQUEST. В новых версиях PHP (от 5.3 и выше), в целях безопасности, по умолчанию информацию о сессиях разрешено передавать с помощью $_GET и $_POST, и запрещено с помощью $_COOKIE. Т.е. по умолчанию в фале php.ini присутствовала такая запись:

request_order = "GP" (т.е. Get и POST)

А у меня на сайте для передачи сессионной информации как раз куки и использовались! Решить проблему можно двумя путями: если есть доступ к php.ini, то надо заменить строку на:

request_order = "GPC"

Если доступа к php.ini нет – можно в файле htaccess прописать дерективу:

php_value request_order GPC

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

  1. 2016-06-20 в 03:45:53 | Айра

    Благодарю вас! Тоже столкнулась с этой проблемой, и благодаря вашей статье быстро решила ее.

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)




(обязательно)