Подтвердить что ты не робот

Использовать значок для отслеживания посещения пользователем веб-сайта

Я прочитал в этот ответ на "Как веб-сайт может отслеживать пользователей даже после очистки куки файлов браузера" , что пользователь может отслеживать через веб-сайт favicon:

Favicons - это третья возможность, которую большинство браузеров запрашивают раньше страница загружается, поэтому, если этот запрос выполняется, тогда клиент очевидно, является повторным посетителем.

Если это действительно возможно, это может быть хорошим способом проверить, посетил ли пользователь сайт раньше, не нужно использовать файлы cookie для этой porpouse.

Я не уверен, что это то, что я могу выполнить с PHP или Javascript (jQuery). Как это можно достичь?

ИЗМЕНИТЬ

То, что я интерпретировал, заключается в том, что пользователь делает звонок, если ему нужен Favicon. Если он этого не делает, значит, у него уже есть значок, поэтому он посетил. Поэтому нет необходимости хранить какой-либо файл (например, файл cookie) на компьютере пользователя или сохранять его IP-адрес на сервере. Правильно ли это?

4b9b3361

Ответ 1

Есть две вещи, которые вам нужно сделать. Сначала вам нужно перенаправить запрос favicon на script. Вы можете сделать это двумя способами. Первым было бы добавить в файл .htaccess что-то вроде следующего:

RewriteEngine on
RewriteRule ^/favicon.ico   /favicon.php  [L]

или вы можете отправить другое местоположение favicon в html-коде. Однако я бы не использовал это для прямой переадресации на php script, так как некоторые браузеры имеют проблемы, правильно используя favicon, если это не реально файл .ico или .png. Возможно, вы можете использовать его для перенаправления в альтернативное расположение favicon.ico и использовать его в сочетании с .htaccess. Я использовал одно расположение значков для всех настроек, чего не требуется. Но таким образом вы знаете, как вы можете его изменить.

<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="32x32">
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" sizes="32x32">

Поскольку вы перенаправляетесь на PHP script, вы можете использовать приведенный ниже код для обработки фактического запроса.

<?php
//the location of the actual favicon
$favicon = '/favicon.ico';
$protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';

//try to get the file info, to be able to get the correct content type
//if it doesnt work, return 404 error
$size = @getimagesize($favicon);
if (!$size) {
  header($protocol . ' 404 Not Found');
  exit();
}

// Content type
header('Content-type: ' . $size[2]);

//when is the icon last modified
//Keep in mind that if you modify the icon, all returning visitors will be handled as new visitors
$last_modified_time = @filemtime($favicon);

header("Accept-Ranges:  bytes");
//set a long max-age with a recheck marker, so people check if the icon is still the same and thus access this script.
header("Cache-Control: max-age=15724800, public, must-revalidate");
header("Vary: Accept-Encoding");
//some say the Etag is bad, some say it isnt. You can remove this part if you dont want to use it.
header("Etag: " . md5($favicon . $last_modified_time));


// exit if not modified
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) {
  if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) { 
      header($protocol .' 304 Not Modified'); 

      /*
      At this point you have a returning visitor.           
      */
      DoSomethingWithReturningVisitor();

      exit();
  }
}

// exit if not modified using Etag, remove it if you dont want to use it.
if (array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)) {
  if ($_SERVER['HTTP_IF_NONE_MATCH'] == md5($favicon . $last_modified_time)) { 
      header($protocol.' 304 Not Modified'); 


      /*
      At this point you have a returning visitor.           
      */
      DoSomethingWithReturningVisitor();


      exit();
  }
}

//you are sending a new image to the user. Add the last modified time.
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");


//log that he is a new visitor
//If you dont to this, the user will be marked as returning visitor when he visits the 2nd page of your website
$_SESSION['newVisitor'] = true;

//return the content of the actual image
echo file_get_contents($favicon);


//A single point to handle returning visitors
//make sure you dont have any output in this function, because you are still returning a valid favicon. If you have any output the returned icon will be corrupted.

function DoSomethingWithReturningVisitor() {
  if (!empty($_SESSION['newVisitor']) && $_SESSION['newVisitor'] === true) {
    //already marked as new visitor, so skip for this session
    return;
  }

  //do something to give this user special treatment
  $_SESSION['returningVisitor'] = true;
}
?>

Теперь при первом запросе вашей веб-страницы это будет сложно отслеживать. Поскольку запрос на главную страницу будет сделан первым, а затем после этого попытается загрузить favicon.ico. Таким образом, информация для нового/возвращающегося посетителя напрямую не доступна в php. Лучший способ проверить, будет ли его возвращающийся посетитель в верхней части домашней страницы чем-то вроде

<?php
if (empty($_SESSION['returningVisitor']) && empty($_SESSION['newVisitor'])) {
   //unknown if user is new or not
} else if (!empty($_SESSION['returningVisitor']) && $_SESSION['returningVisitor']===true) {
   //returning visitor
} else {
   //new visitor
}
?>

Если вам действительно нужно знать его на домашней странице (или любой другой странице, которую пользователь запрашивает в качестве первой страницы для этого сеанса), вам лучше всего будет сделать вызов ajax, когда документ будет загружен, возможно, даже с помощью короткий тайм-аут, потому что запрос favicon.ico не всегда является частью тела.

Ответ 2

Чтобы получить информацию о запросах favicon в Apache, отредактируйте файл .htaccess, чтобы перенаправить запросы favicon на script по вашему выбору. Затем вам нужно будет регистрировать запросы на IP-адреса или использовать файлы cookie, чтобы определить, просто ли посетитель сайта запросил значок или нет.

ИЗМЕНИТЬ
Не забудьте вернуть значок после обработки запроса.

Ответ 3

Я не уверен, что это то, что я могу выполнить с PHP или Javascript (jQuery). Как это можно достичь?

Возможно, вам захочется узнать о различиях в клиентском и серверном программировании.

В вашем случае вы смотрите с точки зрения серверов, поэтому вы хотите использовать серверные возможности (и, возможно, программирование). Таким образом, отслеживание запросов HTTP-сообщений сторонних разработчиков не может быть достигнуто с вашего сервера на стороне сервера. Ваш сервер знает, когда была запрошена favicon, просто зарегистрируйте запрос и интерпретируйте данные.

То, что я интерпретировал, заключается в том, что пользователь делает звонок, если ему нужен Favicon. Если он этого не делает, значит, у него уже есть значок, поэтому он посетил.

Точно, но вы должны также проверить это с помощью некоторых сценариев. Например. Браузер может или не будет принимать во внимание HTTP-кеширование. Итак, узнайте о спецификации, понимайте, для чего она была создана, реализуйте свою интерпретацию данных на основе этих спецификаций и дайте ей полевой тест с разными браузерами и компьютерами.

Таким образом, нет необходимости хранить какой-либо файл (например, файл cookie) на компьютере пользователя или сохранять его IP-адрес на сервере. Правильно ли это?

Ну, вам нужно сохранить хотя бы что-то, если вы хотите его интерпретировать. Это не должно быть файл технически (вы также можете хранить в общей памяти, например), однако вам нужно иметь некоторые данные для работы, и это обычно требует его хранения (где-то).

Ответ 4

Когда браузер запрашивает что-либо с вашего сервера, он отправляет все файлы cookie и т.д. Это также верно для favicon.

Чтобы PHP "перехватил" эти запросы, вам нужно заставить Apache (или какой-либо HTTP-сервер, который вы используете) обрабатывать favicon как php файл.

внутри вашего типа .htaccess(опять же предполагая apache)

<FilesMatch "^favicon.ico$"> 
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</FilesMatch>

Теперь, для favicon, сервер теперь ожидает php файл, и клиент ожидает значок. Таким образом, не может быть никакого свободного пространства на всех вне php или значок не будет работать. Сначала переместите свой реальный значок в real-favicon.ico, а затем создайте новый favicon.ico со следующим

<?php
//do any processing you wish here, all cookies etc are available if needed 

header('Content-type: image/x-icon');
echo file_get_contents ("real-favicon.ico");

вам не нужен последний? > , поэтому его, вероятно, безопаснее оставить, так как некоторые редакторы помещают пустое пространство внизу, которое разбивает изображение.

Без этого метода вам придется анализировать журналы apache, которые ищут эти и соответствующие IP-адреса.

Вам все еще нужна информация о файлах cookie, вы не можете передавать/отслеживать информацию без нее.

Ответ 5

Вы можете использовать перенаправление/переписывание на основе веб-сервера, чтобы передать запрос favicon на серверный язык по вашему выбору. Реализация зависит от вашего вкуса веб-сервера и языка. Но если у вас будет дескриптор script, вы можете просто выполнить отслеживание со страницы.

В качестве альтернативы вы можете попробовать и прочитать лог файлы, если вам не нужна информация в режиме реального времени. Если это так, как вы, вы можете получить более надежные результаты отслеживания robots.txt. Кроме того, в зависимости от вашего веб-сервера журнал может не содержать всю информацию (временную метку, IP-адрес и т.д.), Которые вам нужны.

Однако я бы настоятельно советовал использовать favicons для этого. Нет четкого набора правил для того, когда запрашивается favicon, и браузеры обрабатывают это по-другому. Они могут запросить значок без посещения веб-сайта (только для обновления закладок), или они могут запросить его через регулярные промежутки времени. Запрос фавикон не ограничивается только браузерами; многие веб-приложения используют значки для отображения рядом со ссылкой. Все эти неожиданные хиты, скорее всего, сделают статистику очень ненадежной.

Ответ 6

Ответ, о котором вы говорили, не объясняет технику.

Уловка с favicons для идентификации пользователей работает, предоставляя уникальный URL-адрес favicon для каждого пользователя.

Кроме того, favicon подаётся с заголовками, которые требуют, чтобы браузер подтвердил его.

Когда браузер пользователей проверяет favicon, будет передано его уникальное имя, а ip-адрес может быть, например, заблокирован.

Ответ 7

Либо используйте "cookie", который не так хорош для отслеживания для разных браузеров, либо использует PHP для отслеживания IP-адреса.