Как удалить cookie в PHP? [дубликат]
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом.
Отслеживать
ответ дан 5 авг 2016 в 15:20
28.6k 19 19 золотых знаков 59 59 серебряных знаков 139 139 бронзовых знаков
Я пробовал Ваш вариант вот так — Setcookie(‘1k’, «» ,time()-1000); Это не помогло. Еще важно удалить её до загрузок любых заголовков. я в этом плохо разбираюсь , но у меня шаблон подгружается всё время не тот что нужен
5 авг 2016 в 15:36
@AndreiSukharev без кастлей не как. браузер делает запрос в ответ получает куки. можно через кастыль перезагрузить страницу дважды первый раз отправив запрос а второй раз загрузить уже с новыми кукисами.
setcookie
Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):
setcookie ( string $name , string $value = «» , array $options = [] ): bool
setcookie() задаёт cookie, которое будет передано клиенту вместе с другими HTTP-заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться до остального вывода, включая вывод тегов и , а также пустые строки и пробельные символы.
После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST .
Список параметров
» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name
Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name , допустим, ‘cookiename’ , будет доступно через $_COOKIE[‘cookiename’] .
Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Один из способов установить значение — добавить количество секунд до истечения срока действия cookie к результату вызова функции time() . Например, time()+60*60*24*30 установит, что срок действия cookie истекает через 30 дней. Другой вариант — использовать функцию mktime() . Если задать 0 или пропустить аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).
Замечание:
Можно заметить, что expires_or_options принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает это преобразование автоматически.
Путь к директории на сервере, из которой будут доступны cookie. Если задать ‘/’ , cookie будут доступны во всем домене domain . Если задать ‘/foo/’ , cookie будут доступны только из директории /foo/ и всех её поддиректорий (например, /foo/bar/ ) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.
(Под)домен, которому доступны cookie. Задание поддомена (например, ‘www.example.com’ ) сделает cookie доступными в нем и во всех его поддоменах (например, w2.www.example.com). Для того, чтобы сделать cookie доступными для всего домена (включая поддомены), нужно просто указать имя домена (то есть ‘example.com’ ).
Старые браузеры, следующие устаревшему документу » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.
Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true , cookie от клиента будет передано на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (стоит обратить внимание на $_SERVER[«HTTPS»] ).
Если задано true , cookie будут доступны только через HTTP-протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS-атак (несмотря на то, что поддерживается не всеми браузерами). Стоит однако отметить, что вокруг этой возможности часто возникают споры о её эффективности и целесообразности. Может принимать значения true или false .
Ассоциативный массив ( array ), который может иметь любой из ключей: expires , path , domain , secure , httponly и samesite . При наличии любого другого ключа возникнет ошибка уровня E_WARNING . Значения имеют тот же смысл, как описано в параметрах с соответствующим именем. Значение элемента samesite должно быть либо None , либо Lax , либо Strict . Если какая-либо из допустимых опций не указана, её значения по умолчанию совпадают с значениями по умолчанию для явных параметров. Если элемент samesite не указан, cookie-атрибут SameSite не установлен.
Возвращаемые значения
Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false . Если setcookie() успешно отработает, то вернёт true . Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.
Список изменений
| Версия | Описание |
|---|---|
| 8.2.0 | Формат даты отправляемых файлов cookie теперь ‘D, d M Y H:i:s \G\M\T’ ; ранее он был ‘D, d-M-Y H:i:s T’ . |
| 7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options . Эта подпись поддерживает также настройку cookie-атрибута SameSite. |
Примеры
Ниже представлено несколько примеров, как отправлять cookie:
Пример #1 Пример использования setcookie()
setcookie ( «TestCookie» , $value );
setcookie ( «TestCookie» , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( «TestCookie» , $value , time ()+ 3600 , «/~rasmus/» , «example.com» , 1 );
?>
Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() . Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:
// Вывести одно конкретное значение cookie
echo $_COOKIE [ «TestCookie» ];
?php
// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>
Пример #2 Пример удаления cookie посредством setcookie()
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
// установка даты истечения срока действия на час назад
setcookie ( «TestCookie» , «» , time () — 3600 );
setcookie ( «TestCookie» , «» , time () — 3600 , «/~rasmus/» , «example.com» , 1 );
?>?php
Пример #3 setcookie() и массивы
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
// отправка cookie
setcookie ( «cookie[three]» , «cookiethree» );
setcookie ( «cookie[two]» , «cookietwo» );
setcookie ( «cookie[one]» , «cookieone» );
?php
// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ ‘cookie’ ])) foreach ( $_COOKIE [ ‘cookie’ ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo » $name : $value
\n» ;
>
>
?>
Результат выполнения данного примера:
three : cookiethree two : cookietwo one : cookieone
Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.
Примечания
Замечание:
Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.
- Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задаётся в параметре expires_or_options . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
- При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку, а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение ‘deleted’ , а срок действия переносится на год в прошлое.
- Так как установка значения false приведёт к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для false и 1 для true .
- Cookie можно именовать, как массивы, и они будут доступны в PHP-скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имён и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.
При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.
Смотрите также
- header() — Отправка HTTP-заголовка
- setrawcookie() — Отправляет cookie без URL-кодирования значения
- раздел cookies
- » RFC 6265
- » RFC 2109
Удаление cookie в php?
На нее можно перейти по ссылке в шапке с любой страницы сайта.
После авторизации пользователя нужно редиректнуть на предыдущую страницу (ту с которой перешли).
Для этого я создаю куки в самом начале файла.
Затем внизу если пользователь прошел авторизацию затираю куки и перенаправляю на предыдущую страницу.
IsAuthorized()) < $temp = $_COOKIE['prev_addr']; setcookie("prev_addr","",time()-10000); LocalRedirect($temp); >?>
Но кука не удаляется.
- Вопрос задан более трёх лет назад
- 20016 просмотров
Как очистить все куки?
Здравствуйте, специалисты! Помогите разобраться с, казалось бы, несложными вещами.
Собственно, проблема в чём: нужно очистить все куки, которые я получаю в массиве $_COOKIES.
Проблема усугубляется тем, что для удаления, насколько я понял интернет, нужно указывать те параметры, какие указывались при установке, а в $_COOKIES я из этих параметров вижу только имена и значения.
Надеюсь, вопрос понятен.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Очистить куки после яндекс оплаты
После успешной оплаты яндекс запускает php файл. В нем я заношу в бд нужную информация. Но мне.
Как очистить все файлы с расширением .txt в папке за исключением некоторых
Здравствуйте. Подскажите пожалуйста, желательно с примером, как удалить всё содержимое с файлов с.
Curl, CURLOPT_COOKIEJAR и все-равно ругается, что куки отключены
Добрый день. Ситуация кратко: есть сайт, к нему нет нормального API (обещают, что в разработке, но.
Как очистить куки? VS 2015
Нужно чтобы при нажатии на кнопку программа очищала свои куки. А то она выводит "старую".
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Ну обычно пользуются unset(), который почему-то у многих не удаляет куку по неизвестным причинам, из-за этого еще переустанавливают куки с пустыми значениями, и с прошедшим временем жизни:
1 2 3 4
unset($_COOKIE['param1']); unset($_COOKIE['param2']); setcookie('param1','',time()-3600); setcookie('param2','',time()-3600);
Добавлено через 6 минут
Ну а если вы не знаете названия куки и нужно вообще все затереть, то вот:
foreach($_COOKIE as $key => $value) setcookie($key, '', time() - 3600, '/');
Регистрация: 11.03.2015
Сообщений: 94
1 2 3 4 5 6 7
function set_cookie($name,$value,$expire=1) { if ($expire0) setcookie($name, '', time()-25*3600, '/'); else { $path = explode('/',$_SERVER['REQUEST_URI']); setcookie($name, $value, ($expire==0)?0:(time()+3600*$expire), "/".$path[1]."/", $_SERVER['SERVER_NAME'], false, false); } }
1 2 3 4
foreach ($_COOKIE as $k=>$v) if($v!=='netbeans-xdebug') set_cookie($k,'',-1); redirect('index.php');
Не работает, хоть тресни!
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Ну не знаю, должно работать, у меня работает, может когда редирект на индекс.пхп идет, там опять заново устанавливаются эти куки?
Регистрация: 11.03.2015
Сообщений: 94
Сообщение от UchihaSV 
должно работать, у меня работает
Я рад, что у Вас работает. А у меня не хочет. специально для теста создал страничку http://phantomsoft.ru/cookies/.
Там 2 ссылки. Одна устанавливает куки, вторая должна удалить. Так же показываются все переменные и куки, отправленные на сайт, а также сам php-код.
Пожалуйста, не поленитесь, зайдите. Возможно, так Вам проще будет увидеть ошибку.
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
1 2 3 4 5
function logoff() { foreach ($_COOKIE as $k=>$v) set_cookie($k,'',-1); redirect($_SERVER['PHP_SELF']); }
попробуйте убрать редирект и посмотреть, что получится
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Сообщение от PhantomSoft 
Не работает, хоть тресни!
А что вы подразумеваете, под не работает?
Попробуйте как выше человек сказал, вместо редиректа вывести значение переопределенной куки, она все еще будет иметь значение?
Регистрация: 11.03.2015
Сообщений: 94
Закомментировал редирект. Всё равно куки не очищаются.
Добавлено через 2 минуты
Сообщение от UchihaSV 
Попробуйте как выше человек сказал, вместо редиректа вывести значение переопределенной куки, она все еще будет иметь значение?
Все переменные (в т.ч. и куки) выводятся на оранжевом фоне. И кука присутствует, то бишь не удаляется по ссылке «clear».
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Не очищаются? То есть у куки значение пустое не ставится? А какое-то другое значение имеется?
Регистрация: 11.03.2015
Сообщений: 94
Ну Вы же видите: кука остаётся с тем же значением.
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Ну кука сама по себе может и не удалятся, и скрипт надо делать учитывая это и проверять все по установленному значению!
Добавлено через 39 секунд
Я не вижу отсюда ничего, с каким значением остается?
Регистрация: 11.03.2015
Сообщений: 94
Сообщение от UchihaSV 
Ну кука сама по себе может и не удалятся, и скрипт надо делать учитывая это и проверять все по установленному значению!
Ну как так «может не удалиться»? Спецификция гласит, что обязана умереть! Значит, наверно я её неправильно убиваю. Собственно, в этом как раз и прошу помочь разобраться.
Сообщение от UchihaSV 
Я не вижу отсюда ничего, с каким значением остается?
Сообщение от PhantomSoft 
специально для теста создал страничку http://phantomsoft.ru/cookies/.
Там устанавливается кука «test» со значением «test». И на оранжевом фоне видно, что она есть. А вот удалить не могу!
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
А, unset($_COOKIE[‘param1’]); добавлял?
Регистрация: 11.03.2015
Сообщений: 94
А смысл? Страница перезагружается, куки отправляются на сервер, что получил — то и на экране.
Щас добавлю ради очистки совести, но это ничего не должно дать.
Добавлено через 7 минут
Добавил. Результат тот же
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
Попробуй так:
1 2 3 4 5 6 7 8 9
if (isset($_SERVER['HTTP_COOKIE'])) { $cookies = explode(';', $_SERVER['HTTP_COOKIE']); foreach($cookies as $cookie) { $parts = explode('=', $cookie); $name = trim($parts[0]); setcookie($name, '', time()-1000); setcookie($name, '', time()-1000, '/'); } }
Регистрация: 11.03.2015
Сообщений: 94
Сделал. Но кука жива.
285 / 234 / 113
Регистрация: 08.06.2013
Сообщений: 725
А смотрика, я сначала, зашел на твой сайт с новосятми и т.д., оттуда получил куку f5cc829a852834601e08a44d0943e152 = ‘520h033ilrggpijkskf0bn2u41’
Потом зашел на страницу где якобы у тебя не удаляется кука, там отобразились 2 куки, и та кука с основного сайта удалилась, значит работает!
Отсюда следует что куки установленные через 3 параметра как делают все нормальные люди — удаляются нормально, но нет ты устанавливаешь куку через 7 параметров, вот и думай как потом ее удалять значит:
setcookie($name, $value, ($expire==0)?0:(time()+3600*$expire), "/$path[1]/", $_SERVER['SERVER_NAME'], false, false);
Регистрация: 11.03.2015
Сообщений: 94
Переписал так (обновите у себя страничку):
1 2 3 4 5 6 7 8 9
function set_cookie($name,$value,$expire=1) { $path = explode('/',$_SERVER['REQUEST_URI']); if ($expire0) { setcookie($name, '', time()-3600, "/$path[1]/", $_SERVER['SERVER_NAME'], false, false); setcookie($name, '', time()-3600, "/"); } else { setcookie($name, $value, ($expire==0)?0:(time()+3600*$expire), "/$path[1]/", $_SERVER['SERVER_NAME'], false, false); } }
Теперь удаляет также и куки, установленные сайтом, т.к. параметры совпадают. Но ведь все возможные куки таким способом не удалишь! Тут мы подходим опять к тому, что я писал в первом топике:
Проблема усугубляется тем, что для удаления, насколько я понял интернет, нужно указывать те параметры, какие указывались при установке, а в $_COOKIES я из этих параметров вижу только имена и значения.
Получается, надо перебирать все возможные комбинации параметров, доменов и путей. так, что ли?
А из js случайно нельзя увидеть параметры уже установленных кук?