InterMaster.com.ru

Разное и возможно полезное

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

Просмотров: 13846Комментарии: 1
Рубрика: СайтостроительствоМетки:

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

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

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 RSS

1 Айра 20-06-2016 00:45

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

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

Вы можете войти под своим логином или зарегистрироваться на сайте.

Выберите человечка с поднятой рукой!

При нажатии на картинку, Ваш комментарий будет добавлен.