БлогNot. PHP: проверить, включены ли в браузере клиента cookies

PHP: проверить, включены ли в браузере клиента cookies

Про сами cookies ("куки") и их назначение писать ничего не буду, информации на эту тему куча, а вот вопрос из заголовка, конечно, не новый, но всегда актуальный.

В инете есть как разумные, но неполные, так и бредовые варианты. Давайте напишем небольшой сценарий testcookie.php, который постараемся сделать "универсальным".

Идея в том, что при первом входе на страницу посылается кука без указания срока хранения (временная) и кука, которой назначено жить 2 недели (постоянная). Две недели - это просто так, а вот две куки - потому что в некоторых браузерах можно сделать такую конфигурацию, что куки без даты (их ещё называют сеансовыми) принимаются, а с датой нет, ну или наоборот. Вот картинка выдачи теста из IE8:

сенасовая и обычная кука в IE8
сенасовая и обычная кука в IE8

Затем делается перезагрузка страницы с переданным ей же параметром step=1. Это нужно потому, что вначале сервер направляет cookie клиенту как часть отклика HTTP, потом клиент, если он готов принять cookie, возвращает её серверу.

Следовательно, для проверки того, удался ли этот возврат, нужно ждать следующего запроса HTTP.

Чтобы отличить второй вход от первого, используется условие на наличие переменной $_GET['step'].

Вот он, этот сценарий.

<?php
 $temp_cookie = $persist_cookie = '';
 if (!isset($_GET['step'])) {
  setcookie ('temp_cookie','ok'); //Пытаемся поставить временный кукиз
  setcookie ('persist_cookie','ok',time()+14*24*60*60); //И постоянный на 14 дней
  header ('Location: '.$_SERVER['PHP_SELF'].'?step=1'); //И вызываем себя с параметром step=1
 }
 else { //Это повторный вызов?
  $temp_cookie = $_COOKIE['temp_cookie']=='ok'?'1':'0'; //Установилась временная кука?
  $persist_cookie = $_COOKIE['persist_cookie']=='ok'?'1':'0'; //А постоянная?
  setcookie ('temp_cookie','',time()-14*24*60*60);
  setcookie ('persist_cookie','',time()-14*24*60*60);
   //Надёжный способ удалить кукиз - поставить пустой и просроченный
  //...Теперь проверяем наличие временных и постоянных кукизов
  echo '<br>Cookie test:';
  echo '<br>Temp cookies: '.$temp_cookie;
  echo '<br>Persist cookies: '.$persist_cookie;
 }
?>

На некоторых локалхостах это может не работать, где есть траблы с куками или отдельными настройками безопасности для локальных и внешних адресов, но на любом удалённом сервере работать должно.

А вот с точки зрения SEO может получиться полная фигня. Клиент или поисковый бот заходит по ссылке script.php?step=1, скрипт проверяет наличие куки, и, видя, что её нет, решает, что куки отключены в браузере. Напрашивается идея сделать через переменную сессии, их-то, вроде бы, нигде не отключают? Как-то вот так:

<?php
 session_start();
 if (!isset($_SESSION['test_cookie'])) {
  $_SESSION['test_cookie']='1';
  setcookie ('temp_cookie','ok'); //Пытаемся поставить временный кукиз
  setcookie ('persist_cookie','ok',time()+14*24*60*60); //И постоянный на 14 дней
  header ('Location: '.$_SERVER['PHP_SELF']); //И вызываем себя повторно
 }
 else { //Это повторный вызов?
  $temp_cookie = $_COOKIE['temp_cookie']=='ok'?'1':'0'; //Установилась временная кука?
  $persist_cookie = $_COOKIE['persist_cookie']=='ok'?'1':'0'; //А постоянная?
  setcookie ('temp_cookie','',time()-14*24*60*60);
  setcookie ('persist_cookie','',time()-14*24*60*60);
  unset($_SESSION['test_cookie']);
  session_destroy ();
   //Надёжный способ удалить кукиз - поставить пустой и просроченный
  //...Теперь проверяем наличие временных и постоянных кукизов
  echo '<br>Cookie test:';
  echo '<br>Temp cookies: '.$temp_cookie;
  echo '<br>Persist cookies: '.$persist_cookie;
 }
?>

Увы, на самом деле, в ряде г****браузеров, не соблюдающих никаких стандартов, например, в той же "Опере" 11.50, отключение кукизов будет означать и отключение сессий. Так что в этом случае она выдаст что-нибудь вроде циклического редиректа.

А вот в IE8, к примеру, всё сработает корректно (настройки Cookie в нём находятся так: меню Сервис, Свойства обозревателя, вкладка Конфиденциальность, кнопка Дополнительно).

Массу способов можно придумать с применением Javascript, но он-то тоже может быть отключён.

В общем, если знаете способ надёжней и кроссбраузерней приведённого - пишите :) А на практике, конечно, проще всего исходить из того, что 99% пользователей ничего про отключение кукизов не знают и никогда их не отключают.

Ещё по теме: PHP: авторизация с помощью cookies, простой пример.

Вот совсем короткий код для проверки того, включены ли в браузере cookie-файлы, проверенный в PHP 7.4.2 (XAMPP).

<?php //Проверено в PHP 7.4.2
 $my_cookie = '';
 if (!isset($_GET['step'])) { //Первый вызов
  setcookie ('my_cookie','ok');
  header ('Location: '.$_SERVER['PHP_SELF'].'?step=1');
   //Перезагружаем с параметром step=1
 }
 else { //Это повторный вызов?
  if (isset($_COOKIE['my_cookie']) and 
   $_COOKIE['my_cookie']=='ok') $res = 'Yes';
  else $res = 'No'; 
  setcookie ('my_cookie','', time()-14*24*3600); //удалить
  echo '<br>Cookie test: '.$res;  
 }
?>

20.07.2011, 00:13 [15155 просмотров]


теги: программирование php сервер браузеры opera ie seo

К этой статье пока нет комментариев, Ваш будет первым