Выкарыстоўвайце фавикон для адсочвання карыстальнікаў візіту на сайт

Я прачытаў у гэты адказ <�ЕМ > «Як вэб-сайт можа адсочваць карыстальнікаў нават пасля выдалення печыва браўзэра» , што карыстальнік можа адсочваць праз вэб-сайт фавиконки:

<�Р> Favicons з'яўляюцца трэцяя магчымасць - што большасць браўзэраў запытаць перад тым   старонка загружаная, так што, калі запыт задавальняецца, то кліент   Відавочна, паўторны наведвальнік.

Калі гэта сапраўды магчыма, гэта можа быць добрым спосабам праверыць, калі карыстальнік не наведваў вэб-сайт, не маючы патрэбы выкарыстоўваць кук для гэтага porpouse.

Я не зусім упэўнены, калі гэта тое, што я магу выканаць з PHP або Javascript (Jquery). Як гэта можа быць дасягнута?

EDIT:

Тое, што я інтэрпрэтаваў з гэтым з'яўляецца тое, што карыстальнік робіць выклік, калі ён мае патрэбу ў Favicon. Калі ён не робіць, што назваць гэта азначае, што ён ужо мае фавиконки, каб ён наведаў. Такім чынам, няма неабходнасці захоўваць любы файл (напрыклад, печыва) у кампутары карыстальніка ці захаваць яго IP на сэрвэры. Ці правільна гэта?

19

7 адказы

Ёсць дзве рэчы, якія трэба зрабіць. Перш за ўсё, неабходна перанакіраваць запыт FavIcon да сцэнара. Вы можаце зрабіць гэта двума спосабамі. Першы бы дадаць нешта накшталт наступнага ў ваш .htaccess файл

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

ці вы можаце адправіць іншае месца Favicon ў HTML кодзе. Аднак, я б не выкарыстоўваць гэта, каб непасрэдна перанакіраваць на PHP скрыпт, паколькі некаторыя браўзэры маюць праблемы з выкарыстаннем фавиконки правільна, калі яго не ГЭТАГА а .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 скрыпт, вы можаце выкарыстоўваць гэты код для апрацоўкі фактычнага запыту.

<?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 будзе заўсёды частка цела.

15
дададзена
дзякуй, і пра канцэпцыю, ці значыць гэта, што з дапамогай кода перанакіравання карыстальніка у скрыпт для адсочвання карыстальнікаў, перш чым перадаць FavIcon малюнак?
дададзена аўтар Jack, крыніца
Я крыху заблытаўся, у рэшце рэшт, можна выкарыстоўваць фавиконка аддзяліць першы раз, Vistors ад паўторнага Vistors?
дададзена аўтар Jack, крыніца
Запыт на favicon.ico будзе перанакіроўваць на гэты скрыпт на вэб-сэрвэры, без карыстальніка, заўважыўшы яго, і гэты сцэнар будзе правяраць пэўныя рэчы ў загалоўках, каб убачыць, калі карыстальнік быў іх раней. У рэшце рэшт, ён будзе пасылаць адпаведныя загалоўкі і Favicon гэта сам. Такім чынам, карыстальнік не будзе нават ведаць, Favicon зрабіў нешта яшчэ.
дададзена аўтар Hugo Delsing, крыніца
Гэта была мэта. Гэта не 100% гарантыя, але гэта дае вам магчымасць адсочваць, калі карыстальнік наведаў ваш сайт перш. Гэта альтэрнатыва ўстаноўкі печыва, якая працягвалася пасля таго, як браўзэр зачыняецца, які кажа: "Я быў тут раней»
дададзена аўтар Hugo Delsing, крыніца

Для таго, каб атрымаць інфармацыю аб запытах Favicon ў Apache, адрэдагаваць файл .htaccess для перанакіравання запытаў Favicon ў сцэнар вашага выбару. Затым трэба будзе ўвайсці запыт Адрас IP або выкарыстоўваць кук, каб вызначыць, калі наведвальнік сайта толькі прасіў фавиконка ці не.

EDIT
Remember to return the favicon after handling the request.

6
дададзена
Я крыху confussed, калі гэта на баку сервера або на баку кліента. Няма Javascript рашэння ...?
дададзена аўтар Alvaro, крыніца
Можа быць, я не атрымліваю паняцце правільна. Тое, што я інтэрпрэтаваў з гэтым з'яўляецца тое, што карыстальнік робіць выклік, калі ён мае патрэбу ў Favicon. Калі ён не робіць, што назваць гэта азначае, што ён ужо пабываў. Такім чынам, няма неабходнасці захоўваць любы файл (напрыклад, печыва) у кампутары карыстальніка ці захаваць яго IP на сэрвэры.
дададзена аўтар Alvaro, крыніца
І не забудзьцеся адправіць рэальныя фавиконка ў адказ. :)
дададзена аўтар Brian Lacy, крыніца
Гэта можа быць карысна для ідэнтыфікацыі папярэдняга карыстальніка, які выкарыстоўвае адзін і той жа браўзэр, але змяніў свой IP і ня ачысціць свой кэш Favicon.
дададзена аўтар Fallexe, крыніца
Без IP-трекінг або печыва, вы б ведалі, што запыт на фавиконка быў ад «свежага» кліента, але вы не ведаеце, што любыя наступныя запыты былі ад кліента, які проста прасіў favion.
дададзена аўтар Fallexe, крыніца
«Вы тады павінны былі б увайсці запыт Адрас IP або выкарыстоўваць кук, каб вызначыць, калі наведвальнік сайта толькі прасіў фавиконка ці не.» Ідэя тут такая ж, як раз маё рашэнне.
дададзена аўтар Rajiv007, крыніца

Альбо выкарыстоўваць «печыва», якія не настолькі вялікія, каб адсочваць для розных браўзэраў або выкарыстаць PHP для адсочвання IP-адрас.

3
дададзена
Я зацікаўлены ў «метадзе Favicon», калі ёсць такі метад.
дададзена аўтар Alvaro, крыніца
Ён сказаў, што «без» печыва .....
дададзена аўтар pattyd, крыніца
@pattyd ... чытаць цалкам мой адказ. Я сказаў, што вы можаце выкарыстоўваць печыва (што хутчэй клопатаў бясплатна метад) або IP-адрас. Толькі не ўніз галасавання дзеля яго.
дададзена аўтар Rajiv007, крыніца
Ідэя такой жа «печыва» ўзяць падобныя або нават менш месцаў, чым фавиконка і вы павінны вызначыць, з дапамогай JavaScript толькі ў абедзвюх выпадках. Так што ў любым выпадку ён служыць вашай асноўнай мэты.
дададзена аўтар Rajiv007, крыніца
<�Р> Я не зусім упэўнены, калі гэта тое, што я магу выканаць з PHP або Javascript (Jquery). Як гэта можа быць дасягнута?

Вы можаце даведацца пра адрозненні на баку кліента і на боку сервера праграмавання.

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

<�Р> Тое, што я інтэрпрэтаваў з гэтым з'яўляецца тое, што карыстальнік робіць выклік, калі ён мае патрэбу ў Favicon. Калі ён не робіць, што назваць гэта азначае, што ён ужо мае фавиконки, каб ён наведаў.

Дакладна, але вы павінны таксама праверыць гэта з дапамогай некаторых сцэнарыяў. напрыклад браўзэр можа ці не можа прыняць HTTP кэшавання пад увагу. Так даведацца аб спецыфікацыі, зразумець, для чаго гэта было зроблена для, рэалізаваць інтэрпрэтацыі дадзеных на аснове гэтых спецыфікацый і даць яму палявой тэст з рознымі браўзэрамі і кампутарамі.

<�Р> Такім чынам, няма ніякай неабходнасці захоўваць любы файл (напрыклад, печыва) у кампутары карыстальніка ці захаваць яго IP на сэрвэры. Ці правільна гэта?

Ну, вам трэба захаваць хоць нешта, калі вы хочаце, каб інтэрпрэтаваць яго. Ён не павінен быць файл тэхнічна (можна таксама захоўваць у агульнай памяці, напрыклад), аднак, вы павінны мець некаторыя дадзеныя для працы з, і гэта, як правіла, патрабуе захавання яго (дзесьці).

2
дададзена

Калі браўзэр запытвае што-небудзь з вашага сервера, ён адпраўляе усе печыва і г.д. Гэта таксама дакладна для фавиконки.

Каб атрымаць PHP для «перахопу» гэтыя запыты, якія трэба прымусіць Apache (або тое, што калі-небудзь HTTP сервер, які вы карыстаецеся) для лячэння фавиконки як файл PHP.

ўнутры вашага .htaccess тыпу (ізноў жа пры ўмове, апаш)

 
ForceType application/x-httpd-php
SetHandler application/x-httpd-php

Зараз, для фавиконки, цяпер сервер чакае файл PHP, і кліент чакае значок. Такім чынам, не можа быць ніякага белага прасторы наогул звонку РНР або значок не будзе працаваць. Спачатку перамесціце свае рэальныя фавиконка да рэальнага 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");

you dont need the last ?> so its probably safer to leave it off as some editors put white space at the bottom which will break the image.

Без гэтага метаду, вы павінны разабраць часопісы Apache шукае іх і адпаведнасць IP.

Вы ўсё яшчэ патрэбна інфармацыя печыва, вы не можаце перадаць/адсочваць інфармацыю без яго.

1
дададзена
Я выкарыстаў гэты метад перш, і ён працуе добра. Таксама пераканайцеся, што вы не рэха/высновы нічога іншага, то малюнак у адваротным выпадку вы будзеце мець праблемы.
дададзена аўтар daalbert, крыніца

Адказ вы згадалі не тлумачыць тэхніку.

Трук з значкамі для ідэнтыфікацыі карыстальнікаў работ, падаючы унікальны Favicon URL для кожнага карыстальніка.

Акрамя таго, Favicon падаецца з загалоўкамі, якія патрабуюць браўзэра, каб паўторна праверыць яго.

Калі карыстальнікі браўзэра зноў пацвярджае фавиконки, унікальнае імя яно будзе перададзена, а таксама адрас IP можа быць, напрыклад, забароненыя.

0
дададзена
Як вы можаце адправіць унікальны URL для кожнага карыстальніка, як вам трэба, каб ідэнтыфікаваць карыстальніка з фавиконки. Яго крыху курыца/яйка, таму што вы павінны FavIcon ведаць карыстальнік, але вам патрэбен карыстальнік адправіць унікальныя фавиконка
дададзена аўтар Hugo Delsing, крыніца
праўда, але якія могуць быць апрацаваны.
дададзена аўтар The Surrican, крыніца

Вы можаце выкарыстоўваць вэб-сервер на аснове перанакіравання/перазапіс перадаць запыт Favicon на боку сервера мова па вашаму выбару. Рэалізацыя залежыць ад вашага густу вэб-сервера і мовы. Але калі вы збіраецеся мець сцэнар справіцца з гэтым наўпрост, вы можаце таксама проста зрабіць трэкінг з гэтай старонкі.

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

Тым не менш, я б настойліва рэкамендуем не выкарыстоўваць для гэтага значкі. Там няма дакладнага набору правілаў, калі запытваецца Favicon і браўзэры апрацоўваюць гэта па-рознаму. Яны могуць прасіць фавиконки без наведвання вэб-сайта (проста абнавіць закладкі), або яны могуць запытаць яго праз рэгулярныя прамежкі часу. Запыт не значкі абмяжоўваецца толькі браўзэры небудзь; многія webapplications выкарыстоўваць значкі, каб убачыць побач з спасылкай. Усе гэтыя нечаканыя ўдары, хутчэй за ўсё, зрабіць статыстыку вельмі ненадзейным.

0
дададзена
Дзякуй за параду
дададзена аўтар Alvaro, крыніца