Cookie не отменяется

Хорошо, я в тупике, и часами смотрю на это.

Я устанавливаю файл cookie на /access/login.php со следующим кодом:

setcookie('username', $username, time() + 604800, '/'); 

Когда я пытаюсь выйти из системы, которая находится по адресу /access/logout.php (и переписана в / access / logout), файл cookie, похоже, не будет отменен. Я пробовал следующее:

 setcookie('username', false, time()-3600, '/'); setcookie('username', '', time()-3600, '/'); setcookie('username', '', 1, '/'); 

Я также пытался напрямую нажать /access/logout.php, но он не работает.

Ничего не отображается в журналах php.

Какие-либо предложения? Я не уверен, что я что-то упустил, или что происходит, но настало время смотреть на этот код и пытаться отлаживать.

Как вы определяете, если он не установлен? Имейте в виду, что setcookie () не удалит его из суперкоммулята $ _COOKIE текущего скрипта, поэтому, если вы вызываете setcookie (), чтобы отменить его, а затем сразу print_r($_COOKIE); , он будет отображаться до тех пор, пока вы не обновите страницу.

Попробуйте вставить javascript:alert(document.cookie); в вашем браузере, чтобы убедиться, что вы не сохранили несколько файлов cookie. Очистите все файлы cookie для домена, над которым вы работаете, чтобы убедиться, что вы начинаете новый. Также ini_set(E_ALL); чтобы вы не пропускали никаких уведомлений.

Кажется, это проблема с сервером. Мой последний домен был довольно расслаблен при обработке ошибок PHP, в то время как новый домен показывает каждую ошибку. Я использую оба сайта бок о бок, а старый удаляет куки-файлы так, как должен.

Возможно, существует проблема с часовым поясом? Вы пытались установить что-то более далекое в прошлом, например time() - (3600*24) ? В документации PHP говорится, что внутренняя реализация для удаления файлов cookie использует отметку времени в прошлом году.

Кроме того, вы должны иметь возможность использовать только setcookie('username', false); без передачи временной метки истечения срока действия, поскольку этот аргумент является необязательным. Может быть, в том числе это как-то путает PHP?

Как вы используете данные cookie в своем приложении?

Если вы прочтете файлы cookie и проверьте, не является ли имя пользователя ложным или нет, значит, установить его значение false или '' будет достаточно, так как ваше приложение будет игнорировать значение cookie.

Лучше поместите некоторую защиту в значение cookie, чтобы предотвратить изменение пользователем его значения. Вы можете взглянуть на библиотеку сеансов CodeIgniter, посмотреть, как CI защищает значение cookie с помощью хэша. Будет обнаружено изменение неавторизованного значения, и файлы cookie будут удалены.

Кроме того, CI делает это, чтобы убить файлы cookie:

 // Kill the cookie setcookie( $this->cookie_name, addslashes(serialize(array())), (time() - 31500000), $this->cookie_path, $this->cookie_domain, 0 ); 

Вы также можете удалить файлы cookie из javascript. Проверьте здесь http://www.php.net/manual/en/function.setcookie.php#96599

Простым и удобным способом является использование дополнительных функций:

 function getCookie($name) { if (!isset($_COOKIE[$name])) return false; if ($_COOKIE[$name]=='null') $_COOKIE[$name]=false; return $_COOKIE[$name]; } function removeCookie($name) { unset($_COOKIE[$name]); setcookie($name, "null"); } с function getCookie($name) { if (!isset($_COOKIE[$name])) return false; if ($_COOKIE[$name]=='null') $_COOKIE[$name]=false; return $_COOKIE[$name]; } function removeCookie($name) { unset($_COOKIE[$name]); setcookie($name, "null"); } 

удаление файла cookie прост:

 removeCookie('MyCookie'); .... echo getCookie('MyCookie'); 

У меня была аналогичная проблема.

Я обнаружил, что по какой-то причине, повторяя что-то из logout.php, он фактически удаляет файл cookie:

 echo '{}'; setcookie('username', '', time()-3600, '/'); 

У меня была такая же проблема; Я выхожу из системы (и я вышел из системы), вручную перезагрузите index.php, а затем снова зашел в систему. Затем, когда я выхожу из системы, я правильно выхожу из системы.

Выход из системы – это простая ссылка (index.php? Task = logout). Задача удаляет пользователя из сеанса и «удаляет» (задает значение «и устанавливает истечение в прошлом) cookie, но index.php будет читать токен пользователя auth из файла cookie сразу после этой (или все) задачи ( как при нормальных операциях). Это перезагрузит пользователя. После загрузки страницы браузер не покажет cookie для токена авторизации. Поэтому я подозреваю, что cookie будет написан после загрузки страницы.

Мое простое решение состояло в том, чтобы не читать cookie, если задача была установлена ​​для выхода из системы.

использовать сеансы для аутентификации, не использовать сырые файлы cookie

http://www.php.net/manual/en/book.session.php