php - index - Utilice favicon para rastrear la visita de un usuario a un sitio web
favicon.ico html (7)
Leí en esta respuesta a "Cómo el sitio web puede rastrear a los usuarios, incluso después de borrar las cookies del navegador", que se puede rastrear a un usuario a través del favicon del sitio web:
Los Favicons son una tercera posibilidad, que la mayoría de los navegadores solicitan antes de que se cargue la página, por lo tanto, si esa solicitud se satisface, el cliente es obviamente un visitante recurrente.
Si esto es realmente posible, puede ser una buena forma de verificar si el usuario visitó el sitio web antes, sin necesidad de usar cookies para ese portador.
No estoy seguro de si esto es algo que pueda lograr con PHP o Javascript (jQuery). ¿Cómo se puede lograr esto?
EDITAR :
Lo que interpreté con esto es que el usuario hace una llamada si necesita el Favicon. Si no hace esa llamada, significa que ya tiene el favicon por lo que visitó. Por lo tanto, no es necesario almacenar ningún archivo (por ejemplo, una cookie) en la computadora del usuario o mantener su IP en el servidor. ¿Es esto correcto?
No estoy seguro de si esto es algo que pueda lograr con PHP o Javascript (jQuery). ¿Cómo se puede lograr esto?
Es posible que desee conocer las diferencias entre la programación del lado del cliente y del servidor.
- ¿Cuál es la diferencia entre la programación del lado del servidor y del lado del cliente? (https://softwareengineering.stackexchange.com/)
En su caso, está mirando desde la perspectiva de los servidores, por lo que desea utilizar las capacidades del lado del servidor (y probablemente la programación). Por lo tanto, este seguimiento de solicitudes HTTP de favicon sin cookies se puede lograr con su servidor en el lado del servidor. Su servidor sabe cuándo se solicitó el favicon, simplemente registre la solicitud e interprete los datos.
Lo que interpreté con esto es que el usuario hace una llamada si necesita el Favicon. Si no hace esa llamada, significa que ya tiene el favicon por lo que visitó.
Exactamente, pero también debe probar esto con algunos escenarios. Por ejemplo, un navegador puede o no tener en cuenta el almacenamiento en caché de HTTP . Así que aprenda sobre la especificación, comprenda para qué se ha creado, implemente su interpretación de los datos en base a estas especificaciones y realice una prueba de campo con diferentes navegadores y computadoras.
Por lo tanto, no es necesario almacenar ningún archivo (por ejemplo, una cookie) en la computadora del usuario o mantener su IP en el servidor. ¿Es esto correcto?
Bueno, necesitas almacenar al menos algo si quieres interpretarlo. No debe ser técnicamente un archivo (también puede almacenar en la memoria compartida, por ejemplo), sin embargo, necesita tener algunos datos para trabajar y esto normalmente requiere su almacenamiento (en algún lugar).
Cuando un navegador solicita algo a su servidor, envía todas las cookies, etc. Esto también es válido para el favicon.
Para hacer que PHP "intercepte" estas solicitudes, debe forzar a Apache (o al servidor HTTP que esté utilizando) para que trate el favicon como un archivo php.
dentro de su tipo .htaccess (nuevamente asumiendo apache)
<FilesMatch "^favicon.ico$">
ForceType application/x-httpd-php
SetHandler application/x-httpd-php
</FilesMatch>
ahora, para el favicon, el servidor ahora espera un archivo php, y el cliente espera un icono. Por lo tanto, no puede haber espacios en blanco fuera del PHP o el icono no funcionará. Primero mueva su favicon real a real-favicon.ico y luego haga un nuevo favicon.ico con lo siguiente
<?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");
¿No necesitas lo último?> así que probablemente sea más seguro dejarlo ya que algunos editores ponen espacios en blanco en la parte inferior, lo que romperá la imagen.
Sin este método, tendría que analizar los registros de apache en busca de estos y hacer coincidir las IP.
Aún necesita información de cookies, no puede pasar / rastrear información sin ella.
La respuesta a la que te referiste no explica la técnica.
El truco con los favicons para identificar a los usuarios funciona al proporcionar una URL de favicon única a cada usuario.
Además, el favicon se sirve con encabezados que requieren que el navegador lo vuelva a validar.
Cuando el navegador de los usuarios vuelva a validar el favicon, se pasará su nombre único y, por ejemplo, la dirección IP se puede prohibir.
Para obtener información sobre las solicitudes de favicon en Apache, edite su archivo .htaccess para redireccionar las solicitudes de favicon a un script de su elección. Luego deberá registrar las direcciones IP de solicitud o usar cookies para determinar si un visitante del sitio acaba de solicitar un favicon o no.
EDITAR
Recuerde devolver el favicon después de manejar la solicitud.
Puede usar una redirección / reescritura basada en un servidor web para pasar la solicitud de favicon a un idioma del lado del servidor de su elección. La implementación depende de su sabor del servidor web y del idioma. Pero si va a tener un script que maneje esto directamente, también puede hacer el seguimiento desde la página.
Alternativamente, puede probar y leer los archivos de registro si no necesita información en tiempo real. Si así es como lo hace, puede obtener resultados más confiables para el seguimiento de robots.txt. Además, dependiendo de su servidor web, es posible que el registro no contenga toda la información (marca de hora, IP, etc.) que necesita.
Sin embargo, recomiendo encarecidamente no usar favicons para esto. No hay un conjunto claro de reglas para cuando se solicita un favicon y los navegadores manejan esto de manera diferente. Pueden solicitar el favicon sin visitar el sitio web (solo para actualizar los marcadores) o pueden solicitarlo a intervalos regulares. La solicitud de favicons no se limita solo a los navegadores; muchas aplicaciones web utilizan favicons para mostrar junto a un enlace. Todos esos golpes inesperados probablemente harán que las estadísticas sean poco confiables.
Use una "cookie" que no es tan buena para rastrear diferentes navegadores o use PHP para rastrear la dirección IP.
Hay dos cosas que debes hacer. Primero necesitas redirigir la solicitud de favicon a un script. Puede hacer esto de dos maneras. Lo primero sería agregar algo como lo siguiente a su archivo .htaccess
RewriteEngine on
RewriteRule ^/favicon.ico /favicon.php [L]
o puede enviar otra ubicación de favicon en el código html. Sin embargo, no usaría esto para redirigir directamente al script php, ya que algunos navegadores tienen problemas al usar el favicon correctamente si no es realmente un archivo .ico
o .png
. Quizás pueda usarlo para redirigir a una ubicación alternativa de favicon.ico
y usarlo combinado con el .htaccess
. Utilicé una ubicación de icono para todas las configuraciones, que no es realmente necesaria. Pero de esta manera sabes cómo puedes alterarlo.
<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">
Ya que está redirigiendo a un script PHP, puede usar el siguiente código para manejar la solicitud real.
<?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;
}
?>
Ahora, en la primera solicitud a su página web, esto será difícil de rastrear. Debido a que la solicitud a su página de inicio se hará primero y luego intentará cargar el favicon.ico
. Por lo tanto, la información para el visitante nuevo / recurrente no está disponible directamente en php. La mejor manera de verificar si es un visitante recurrente en la parte superior de la página de inicio sería algo así como
<?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
}
?>
Si realmente necesita saberlo en la página de inicio (O en cualquier otra página que el usuario solicite como primera página para esta sesión), lo mejor sería hacer una llamada ajax cuando se cargue el documento, tal vez incluso con un breve tiempo de espera porque La solicitud favicon.ico no siempre es parte del cuerpo.