Herkunftsland des Besuchers ermitteln

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 des Besuchers.

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($ip);
?>

Der Host, den 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 beliebig für weitere ISPs 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
echo $country;
?>

Ein reales Beispiel kann man sich so vorstellen:

IP: 83.78.33.222

führt zum Host

222-33.78-83.cust.bluewin.ch

ergibt als Land

ch

Eine Liste um die TLD dem dazugehörigen ausgeschriebenen Namen des Landes zuzuordnen, kann hier als PHP-Array heruntergeladen werden.

Links