|
|
|
| Задача: определить поддерживаются ли браузером и включены ли куки у пользователя без использования ява скрипта.
Варианта я придумал 2.
Первый: Включаю mod_rewrite и если пользователь только зашел на сайт, т.е. если http_referer не с моего домена или не установлен, он перебрасывается на файл start.php, который устанавливает ИД сессии в куки и перебрасывает пользователя обратно на ту страницу, которую он запросил. Когда он попадает на нее, то скрипт сразу видит: если куки не установлены, значит они отключены или не поддерживаются. Значит в дальнейшем идентификатор сессии нужно передавать в GET.
Второй: пользователь сразу попадает на запрошенную страницу. Опять же по http_referer определяется первая ли это страница с моего домена и если первая, то скрипт стартует новую сессию и для начала передает ее идентификатор и в куках и в GET. Когда скрипт определяет на следующей странице, что это уже не первая страница, то по наличию установленных кукес определяется их поддержка.
Второй вариант работает четко, до тех пор пока не включаешь mod_rewrite для использования ЧПУ. А когда включаешь, то, само собой, все страницы становятся "первыми", т.к. при редиректе исчезает http_referer =( Кроме того, первый вариант предпочтительнее, т.к. в start.php можно выполнить еще дополнительные задачи, такие например как удалить из урл идентификатор сессии полученный человеком на гугле, определить в каком формате пользователю отдавать контент (WML, HTML, xHTML) и т.п. Но он (первый вариант) не работает! Может я чет еще не учел в правилах просто.... Правила такие:
RewriteCond %{HTTP_COOKIE} !(sid=[a-z0-9]+) [NC]
RewriteCond %{HTTP_REFERER} !(moj_domen\.ru) [NC]
RewriteRule ^.*$ start.php [L]
|
А может проще способ решить задачу есть? Может я перемудрил? | |
|
|
|
|
|
|
|
для: Sfinks
(11.12.2011 в 20:26)
| | Хотя нет.....
Похоже когда формат ответной страницы ХТМЛ, то работает. А вот если ВМЛ, то зацыкливается на start.php.
Не подскажите как бы выкрутиться?
Т.е. ситуация: куки не работают, разметка страницы WML. При этой разметке, я так понял, во время редиректа по таймеру
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml><card ontimer="/"><timer value="0" /></card></wml>
| http_referer не передается.
Каким бы еще способом указать мод_реврайту, что используется ВМЛ и редиректить на start.php не надо? При этом изменение урла (типа не "/" а "/wml/") использовать не желательно, т.к. тогда придется полностью дублировать все правила в ЧПУ для вмл-страниц. | |
|
|
|
|
|
|
|
для: Sfinks
(11.12.2011 в 21:12)
| | Вообще, можно обойтись и без ModRewrite.
Допустим, есть 2 скрипта index.php - отдаёт необходимое содержимое и set_cookie.php - устанавливает пользователю куки.
index.php:
<?php
//Если это первое обращение к скрипту - переадресуем на страницу set_cookie.php
if(empty($_GET['first_time']))
{
header("Location: set_cookie.php");
exit();
}
//Если это не первое обращение к скрипту, то можно проверить, удалось ли установить куки
else
{
//Если куки поддерживаются
if($_COOKIE['work'] == "yes")
{
$cookie_work = TRUE:
}
//Если куки не поддерживаются
else
{
$cookie_work = FALSE;
}
}
?>
|
set_cookie.php:
<?php
//Установим куки на 1 год
setcookie("work", "yes", time() + 365*24*3600, "/");
header("Location: index.php?first_time=no");
?>
|
Это, конечно, сыроватый вариант, но рабочий. При желании, его можно оптимизировать. | |
|
|
|
|
|
|
|
для: Ирбис
(12.12.2011 в 17:50)
| | Чтоб работало - это не проблема. Проблема чтоб работало красиво! Т.е. незаметно для пользователя и максимально скрытно от роботов. Кроме того сайт на ЧПУ планируется, так что get - не вариант. | |
|
|
|
|
|
|
|
для: Sfinks
(11.12.2011 в 20:26)
| | Вообще на HTTP_REFERER полагаться довольно опасно, если его подделка тут не помешает, но антивирус или FireWall могут помешать... Я так понимаю речь идет о мобильном доступе к сайту? | |
|
|
|
|
|
|
|
для: cheops
(12.12.2011 в 17:27)
| | Да, о мобильном.
А как если не по хттп_рефереру определить сколько страниц пользователь уже посмотрел? Вернее не сколько, а первую смотрит или уже не первую.... | |
|
|
|
|
|
|
|
для: Sfinks
(12.12.2011 в 17:32)
| | Если половина пользователей (и это пользователи, а не роботы) использует браузеры, не поддерживающие cookie, то пожалуй никак - протоколы, древние, на это не расчитаны. Только добрая воля или лень пользователей, которые не бегут сразу отключать cookie позволяет такие проверки устраивать в "большом" Web. А мобильный Web он всегда отстает, там где через пару лет будут использоваться более удобные хранилища, вам придется полагаться на менее удобные COOKIE, а сейчас вот приходится осуществлять проверку включены ли они, хотя в большом Web этого уже никто не делает: Специально отключил? Вот и сиди без 50% сайтов :))) | |
|
|
|
|
|
|
|
для: cheops
(12.12.2011 в 18:06)
| | Да, я в общем-то пришел к такому же выводу. Поэтому проверка будет осуществляться по второму варианту. Там отсутствие реферера не критично. А если встретится wml (по статистике их еще используют 2% пользователей), то ему просто выведется предложение обновить браузер и ссылка на миниоперу. Как считаете? | |
|
|
|
|
|
|
|
для: Sfinks
(12.12.2011 в 19:11)
| | Ну наверное самый оптимальный вариант, хотя 2% можно и игнорировать - я думаю, посетители с такими браузерами в курсе, что у них не браузер, а барахло, и что лазить по нему в Интернет можно только чтобы посмотреть, что произойдет :)))
Кстати, вы же вероятно еще и USER_AGENT проверяете, т.е. если пользователь сообщает, что он пользуется MiniOpera вероятно можно и не проверять ничего - не поддерживаешься куки, ну и нечего врать... насколько я помню MiniOpera не больно-то много настроек предлагает и cookie там так запросто не отключишь. | |
|
|
|
|
|
|
|
для: cheops
(12.12.2011 в 20:34)
| | > насколько я помню MiniOpera не больно-то много настроек предлагает и cookie там так запросто не отключишь.
Я уж сам не помню.... Знаю тока что они новые версии штампуют как нефик делать.... Там и настроек куча уже, и многостраничность и много че еще. На это не стоит надеяться. | |
|
|
|