Как проверить, включены ли cookies

В процессе разработки пользовательских веб-интерфейсов случается, что возникает необходимость использования cookies, а в противном случае предлагать посетителю ограниченный интерфейс с замечанием, что для полноценной работы необходимо включить cookies в браузере. Ну, либо использовать альтернативный вариант идентификации сессии.

Для этого пишем модуль на PHP, который должен подключаться каждый раз при запросе любой страницы сайта или его раздела. Этот модуль должен подключаться до запуска любых заголовков. В нём мы будем устанавливать cookies и проверять их установку. Единственная сложность в том, что в процессе одного цикла работы скрипта выполнить это не удастся. Допустим, сделаем попытку установить cookies на 10 минут и тут же проверить установку, не отходя от кассы:

setcookie ("test", "Hello", time()+600);
print_r ($_COOKIE);

В результате работы этого скрипта вы получите: Array ( ), а вот если обновить страницу, тогда только появится желаемое: Array ( [test] => Hello ). Внесём изменение в скрипт, чтобы получить желаемый функционал:

if (! @$_GET['rnd'] and ! @$_COOKIE['test-2']) {
	setcookie ("test-2", "Hello 2", time()+600);
	header ('Location: '.$_SERVER['REQUEST_URI'].'?rnd='.rand());
}
if (! @$_COOKIE['test-2']) echo 'Включите cookies в браузере';
else { echo 'Cookies установлены: '; print_r ($_COOKIE['test-2']); }

Теперь в результате запроса страницы вы получите либо: Cookies установлены: Hello 2 — если в вашем браузере кукисы включены, либо: Включите cookies в браузере — в противном случае. И вам остаётся только прицепить свой обработчик событий.

Добавлено. Пример работать не будет, если REQUEST_URI уже содержит GET-параметры. В таком случае достаточно 3-ю строчку примера заменить на:

$uri = $_SERVER['REQUEST_URI'];
if ( false !== strpos( $uri, '?' ) ) $uri .= '&'; else $uri .= '?';
header ('Location: '.$uri.'rnd='.rand());

Внимательный кодер может заметить, что при этом скрипт автоматически редиректит с кодом 302 (временный редирект) на адрес типа ?rnd=1209514597. Тут будьте внимательны, если у вас не ЧПУ — в крайнем случае, откажитесь от параметра запроса «rnd». Но, наверняка, вас интересует ещё и SEO вопроса. Объясняю.

Лучший довод — конкретный пример. На сайте rieltor.ua существует такая система, и там запрос проходит аж через 2 редиректа (зачем-то, хз). По данным Solomono на него ссылается около 1,5 тысяч доменов, при этом сайт имеет 25 000 страниц в индексе Яндекса (в Гугле на 3 порядка больше, но он считает с поддоменами), тИЦ 30 и почти 10 000 посетителей. Не вижу каких-либо проблем в связи с его редиректами. К тому же, вы можете установить подобную систему лишь на мемберскую часть сайта.

Запись опубликована в рубрике Web-мастеринг с метками . Короткая ссылка для добавления в закладки: Как проверить, включены ли cookies.

2 Responses

  1. я говорит:

    твой скрипт будет работать только в частном случае.

    например если $_SERVER['REQUEST_URI'] будет index.php?id=site твой скрипт просто лежит.

    а если отказаться от параметра запроса «rnd», то переадресация никогда не остановится.

    а через 2 редирикта проходит как раз для того, чтобы из твоего частного случая сделать общий

    • Pavluha.Net говорит:

      Спасибо за подсказку. Действительно, мой пример работать не будет, если REQUEST_URI уже содержит GET-параметры. Но «косяк» легко исправляется (в статье добавил поправку). И так можно сделать хоть 10 редиректов, но сомневаюсь, что работать они будут лучше одного единственного.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Иногда ваш комментарий может не отобразиться сразу после публикации - будто пропал. Не волнуйтесь, он не пропадёт и появится потом, после моего одобрения.