Herkunftsland des Besuchers ermitteln

Oktober 2009

Mit dem hier beschriebenen Script, kann man ohne zusätzliche PHP-Extensions oder Datenbanken das Herkunftsland mehr oder weniger genau bestimmen.
Man ermittelt als erstens mit der Funktion gethostbyaddr() den Host der IP-Adresse der Besuchers.
<?php
$ip 
$_SERVER['REMOTE_ADDR'];
$host gethostbyaddr($ip);
?>
Der Host, welchen wir bekommen haben, enthält eine Top-Level-Domain (z.B. de oder ch). Diese extrahieren wir nun:
<?php
$country 
= (strpos($host'.')===false) ?
           
$host :
           
substr(strrchr($host'.'), 1);
?>
Und schon ist das Länderkürzel in der Variable $country gespeichert.

Allerdings kommt es häufig vor, dass der Host auf .com oder .net endet, die man also nicht auf ein Land zuordnen kann. Daher sollte man die grössten Brocken "von Hand" korrigieren.
<?php
$hostTrans 
= array(
  
'.arcor-ip.net'=>'.de',  '.t-dialin.net'=>'.de',
  
'.sui-inter.net'=>'.ch''.drei.com'=>'.at',
  
'.proxad.net'=>'.fr',    '.gaoland.net'=>'.fr',
  
'.mchsi.com'=>'.us',     '.comcast.net'=>'.us',
  );
$host strtr($host$hostTrans);
?>
Wenn nun beispielsweise jemand von t-dialin.net kommt, wird er als Deutscher identifiziert.
Das Array $hostTrans lässt sich entsprechend erweitern.

Als ganzes ergibt sich dann folgendes Script:
<?php
$ip 
$_SERVER['REMOTE_ADDR'];
// Host ermitteln
$host gethostbyaddr($ip);
// Host-Korrekturen
$host strtolower($host);
$hostTrans = array(
  
'.arcor-ip.net'=>'.de',  '.t-dialin.net'=>'.de',
  
'.sui-inter.net'=>'.ch''.drei.com'=>'.at',
  
'.proxad.net'=>'.fr',    '.gaoland.net'=>'.fr',
  
'.mchsi.com'=>'.us',     '.comcast.net'=>'.us',
  );
$host strtr($host$hostTrans);
// Herkunftsland (TLD) ausschneiden
$country = (strpos($host'.')===false) ?
           
$host :
           
substr(strrchr($host'.'), 1);
// Fehler bei gethostbyaddr()
if($ip === $host)
  
$country '?';

# Mögliche Inhalte von $country:
# de, uk, com, ?, localhost
?>

Ein reales Beispiel kann man sich so vorstellen:
IP: 83.78.33.222führt zum Host
222-33.78-83.cust.bluewin.chergibt als Land
ch
Um zu einer TLD den dazugehörigen ausgeschriebenen Namen des Landes zu erhalten, siehe dieses PHP-Array.

Siehe auch:
 


Andere Einträge


Kommentare

#1
von Fosforito am 06.02.2013
Funktioniert prima!
;)

#2
von unwissend am 27.01.2014
Hallo,
Mir ist nur noch nicht klar wo die Daten ausgegeben werden?
Wird eine TXT Datei geschrieben? Oder wo kann ich die Liste der Besucher einsehen?

Ansonsten gutes Skript

#3
von Emxa am 26.11.2014
Klappt prima! :)

#4
von Leo Feuerwerk am 22.02.2015
Funktioniert gut, vielen Dank :)

Das Land kann man einfach per
echo $country; ausgeben lassen.