[PHP] exploden gaat verkeerd door document.referrer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Mijn CMS'je werk als volgt.

1. Elke URL schrijf ik met behulp van mod_rewrite om naar http://www.mijnsite.com/index.php?q=... Zo wordt bijvoorbeeld http://www.mijnsite.com/fruit/appels/index.htm omgezet in http://www.mijnsite.com/index.php?q=fruit/appels/index.htm

2. Vervolgens explode ik de q op '/' en kan er dan leuke dingen mee doen. Zo is normaal gesproken het eerste element van die geexplode q - array de module die geactiveerd dient te worden: mijnsite.com/forum/10 wil zeggen: include het bestand forum.php en zoek alle posts met forum_id 10.

Nu zit ik met een probleem. Ik ben pas begonnen aan een tracking script, statistieken over de bezoekers te verzamelen. Het idee is om een 1 bij 1 gifje aan te roepen met als src de url van het trackingscript, zoals eigenlijk iedereen doet.

Ik heb nu het volgende:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function track() {
  w  = screen.width;
  h  = screen.height;
  cp = (navigator.appName.indexOf("Microsoft") > -1) ? 
       screen.colorDepth : screen.pixelDepth;
  r  = escape(document.referrer);
  
  t  = base_href+'track/'+w+':'+h+':'+cp+':'+r;

  document.write('[img]"'+t+'"[/img]');
}

Met andere woorden: ik wil de module track.php activeren. Die module explode de w+h+... string op ':' en als het goed is krijg ik dan een array als $arr[0] = 1024, $arr[1] = 768, etc.

Maar nu het probleem: in de document.referrer zitten natuurlijk ook '/', waardoor mijn eerste explode in de war raakt!

Nu kan ik dit probleem op twee manieren oplossen:
1. ik maak een uitzondering op de rewrite rule van mijn cms (ik heb hier alleen grote moeite mee vanwege de lastige documentatie):
code:
1
2
3
4
5
6
7
8
9
10
# Rewrite rules
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /cms

  # Rewrite URLs of the form 'index.php?q=x':
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>


2. ik vervang de '/'en in de document.referrer in het tracking javascript eerst door een ander teken (bv. '\') alvorens het te versturen. Maar klinkt dit niet heel omslachtig?

Graag jullie mening, oplossingen, etc. Want na enkele uren prutsen kom ik er niet goed meer uit :'(

[ Voor 27% gewijzigd door Reveller op 24-08-2004 00:27 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
Ik zou zeggen dat je zoveel mogelijk met PHP zou moeten afhandelen voor een tracking script. Javascript is alleen nuttig voor de maten van de viewport, de gebruikte browser en de referrer kan PHP ook voor je genereren, zélfs als de gebruiker JS uitgeschakeld heeft.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$referrer=str_replace('/','|',$_SERVER["HTTP_REFERER"]);
$browser = $_SERVER["HTTP_USER_AGENT"];
?>
<head>
 <script>
  function AddWidthAndHeight() 
   {
     w  = screen.width;
     h  = screen.height;
     t  =  '[img]"track/'[/img]:' + '<? echo $browser; ?>:' + ':' + w + ':' + h + '" height="0" width="0" />';
  document.getElementById('track').innerHTML = t;
   }
</script>
</head>

<body onload="AddWidthAndHeight()">

<div id="track">
 [img]"track/<?[/img]" width="0" "height="0" />
</div>


Iets als bovenstaande (zitten vast foutjes in ;)) zou ongeveer moeten werken. Dit geeft in track.php ALTIJD een array waarin het eerste element de referrer is (met '|' ipv '/') en de gebruikte browser. Mocht de user JS aan hebben dan krijg je als derde en vierde element ook de breedte en hoogte van de viewport mee...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
De referer ophalen in track.php met $_SERVER['HTTP_REFERER'] zal in ieder geval niet werken. Dat is namelijk de pagina waarin het gifje wordt aangeroepen.
Zoals in bovenstaand voorbeeld staat kun je het wel doen. En je zou eerst nog een base64_encode erop los kunnen laten om te voorkomen dat er slashes in staat.

De useragent zou ik wel gewoon in track.php uit PHP ophalen (= $_SERVER['HTTP_USER_AGENT'])