Comment faire pour

détecter l'adresse IP du visiteur

L'adresse IP du visiteur (ou du proxy qu'il utilise) peut se trouver dans plusieurs variables d'environnement.
Dans la grande majorité des cas, même pour un site comme celui-ci, il suffit d'utiliser $_SERVER["REMOTE_ADDR"].
Les autres variables sont rarement renseignées et généralement difficiles à analyser. C'est le cas pour HTTP_VIA, HTTP_X_COMING_FROM, HTTP_X_FORWARDED, HTTP_COMING_FROM, HTTP_FORWARDED_FOR et HTTP_FORWARDED.
HTTP_X_FORWARDED_FOR permet parfois d'avoir une information plus précise. Cette variable peut contenir plusieurs valeurs : unknown, une ou plusieurs adresses IP séparées par des virgules ou des espaces.
Avant toute utilisation, il faut donc s'assurer que la valeur est exploitable.
On élimine donc toutes les adresses IP privées :

  • 10.0.0.0 - 10.255.255.255
  • 127.0.0.0 - 127.255.255.255
  • 169.254.0.0 - 169.254.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255
  • 224.0.0.0 - 239.255.255.255

Puis tout texte.


$forwarded = $_SERVER["HTTP_X_FORWARDED_FOR"];
if($forwarded)
{
$forwarded = preg_split("/,| /",$forwarded);
$forwarded = $forwarded[0];
if (preg_match("/^((10|127|22[4-9]|23[0-9])\.\d{1,3}|172\.(1[6-9]|2\d|3[0-1])|192\.168|169\.254)(\.\d{1,3}){2}$/",$forwarded)){$forwarded = "";}
if (!preg_match("/^([0-9]{1,3}(\.|$)){4}/",$forwarded) && $forwarded){$forwarded = "";}
if($forwarded){$no_ip = $forwarded;}
}
if(!$forwarded){$no_ip = $_SERVER["REMOTE_ADDR"];}
/*Résultat :
$no_ip="18.188.66.13";*/

Votre adresse IP correspond donc à 18.188.66.13

détecter le pays d'origine du visiteur

Toutes les méthodes détaillées ci-dessous sont plus ou moins fiables.
Dans votre cas :
1. inconnu 2. UNITED STATES 3. INCONNU 4. INCONNU 5. INCONNU 6. UNITED STATES 7. UNITED STATES
Le plus probable : UNITED STATES

1. Resultats fournis par freegeoip

Service indisponible / fonction php file () bloquée par l'hébergeur depuis 2008

Pays :

Ville :

Plutôt fiable avec : la plupart des grands pays.

Peu fiable avec : AOL, tele2, chello, colt, les grosses sociétés.

Code avec votre adresse IP (18.188.66.13) :

$no_ip=$_SERVER["REMOTE_ADDR"]; /*$no_ip="18.188.66.13";*/
/*ou $no_ip=getenv("REMOTE_ADDR");*/
$hostip = "https://freegeoip.app/json/18.188.66.13";
$result = file_get_contents($hostip);
$result = json_decode($result);
/*
Dans l'objet $result, on trouve :
$result->country_code : (donc )
$result->city :
$result->latitude :
$result->longitude :
*/

Resultats fournis par extreme-ip

Service indisponible / fonction php file () bloquée par l'hébergeur depuis 2008

Pays :

Ville :

Latitude :

Longitude:

Plutôt fiable avec : la plupart des grands pays.

Peu fiable avec : AOL, tele2, chello, colt, les grosses sociétés.

Code avec votre adresse IP (18.188.66.13) :

$no_ip=$_SERVER["REMOTE_ADDR"]; /*$no_ip="18.188.66.13";*/
/*ou $no_ip=getenv("REMOTE_ADDR");*/
$hostip = "https://extreme-ip-lookup.com/json/18.188.66.13";
$result = file_get_contents($hostip);
$result = json_decode($result);
/*
Dans l'objet $result, on trouve :
$result->country :
$result->city :
$result->lat :
$result->lon :
*/

2. ip-to-country

Pays : UNITED STATES

Plutôt fiable avec : la plupart des grands pays.

Peu fiable avec : AOL, tele2, chello, colt, les grosses sociétés, African Internet Numbers Registry, la zone Asie-Pacifique.

Code avec votre adresse IP (18.188.66.13) :

`origin` est la table créée à partir du fichier d'ip-to-country

$paysdorigine="inconnu";
$no_ip=$_SERVER["REMOTE_ADDR"]; /*$no_ip="18.188.66.13";*/
/*ou $no_ip=getenv("REMOTE_ADDR");*/
$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$res=mysql_query($serveur,"SELECT COUNTRY_NAME FROM `origin`
WHERE inet_aton('$no_ip')>=IP_FROM AND inet_aton('$no_ip')<=IP_TO;");
$ref=mysql_fetch_row($res);
if($ref[0]){$paysdorigine=$ref[0];}
/*Résultat :
$paysdorigine="UNITED STATES"; */

Plus d'information
Comme la base de données d'IP-to-country n'est plus mise à jour, il est préférable d'utiliser celle de GeoIP legacy databases.

3. Domaine

Hôte : ec2-18-188-66-13.us-east-2.compute.amazonaws.com

Pays : INCONNU

Plutôt fiable avec : la plupart des pays, tele2, chello.

Inutilisable avec : les extensions .com, .net,.org ...

Code avec votre Hôte (ec2-18-188-66-13.us-east-2.compute.amazonaws.com / 18.188.66.13) :

`origin` est la table créée à partir du fichier d'ip-to-country

$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$paysdorigine="inconnu";
$no_ip=$_SERVER["REMOTE_ADDR"]; /*$no_ip="18.188.66.13";*/
/*ou $no_ip=getenv("REMOTE_ADDR");*/
$hote=gethostbyaddr($no_ip); /*$hote="ec2-18-188-66-13.us-east-2.compute.amazonaws.com";*/
if ($hote!="")
 {
 $inconnuhote=explode('.',$hote);
 $inconnuextension=$inconnuhote[count($inconnuhote)-1];
 $res=mysql_query($serveur,"SELECT DISTINCT COUNTRY_NAME FROM `origin` WHERE COUNTRY_CODE='$inconnuextension'");
 $ref=mysql_fetch_row($inconnures);
 if ($ref[0]){$paysdorigine=$ref[0];}
 }
/*Résultat :
$paysdorigine="INCONNU"; */

4. Langage préféré

Langage préféré:

Pays : INCONNU

Plutôt fiable avec : AOL, MSIE.

Peu fiable avec : les dernières versions d'Opera, Mozilla, Konqueror, navigateurs texte.

Code avec votre Langage préféré () :

`origin` est la table créée à partir du fichier d'ip-to-country

$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$paysdorigine="inconnu";
$accepted_language=getenv("HTTP_ACCEPT_LANGUAGE");
$accepted_language=strtoupper($accepted_language);
$preg="/^([A-Z]{2}-)?([A-Z]{2})/";
preg_match($preg,$accepted_language,$lang);
$acceptlang=preg_replace($preg,"$2",$lang[0]);
 switch ($acceptlang)
  {
  case "EL" : $paysdorigine="GREECE";break;
  case "HE" : $paysdorigine="ISRAEL";break;
  case "SE" : $paysdorigine="SWEDEN";break;
  case "JA" : $paysdorigine="JAPAN";break;
  default : $result=mysql_query($serveur,"SELECT DISTINCT `COUNTRY_NAME` FROM `origin` WHERE `COUNTRY_CODE`='$acceptlang'");
           $test=mysql_fetch_row($result);
           if ($test[0]){$paysdorigine=$test[0];}
  }
/*Résultat :
$paysdorigine="INCONNU"; */

5. Langage de l'UA

User Agent : Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)

Pays : INCONNU

Inutilisable avec : MSIE.

Code avec votre Langage de l'UA (Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)) :

`origin` est la table créée à partir du fichier d'ip-to-country

function getlangfromUA($string)
{
 $string=strtoupper($string);
 $preg="/(?:; |\[)(?:[A-Z]{2}-)?([A-Z]{2})(\]|; RV|\))/";
 preg_match($preg,$string,$lang);
 return $lang[1];
}
//
$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$paysdorigine="inconnu";
$UA=getenv("HTTP_USER_AGENT");
$accepted_language=getlangfromUA($UA);
if ($accepted_language)
{
 $accepted_language=strtoupper($accepted_language);
 $preg="/^(?:[A-Z]{2}-)?([A-Z]{2})/";
 preg_match($preg,$accepted_language,$lang);
 $acceptlang=$lang[1];
  switch ($acceptlang)
  {
  case "EL" : $paysdorigine="GREECE";break;
  case "HE" : $paysdorigine="ISRAEL";break;
  case "SE" : $paysdorigine="SWEDEN";break;
  case "JA" : $paysdorigine="JAPAN";break;
  default : $result=mysql_query($serveur,"SELECT DISTINCT `COUNTRY_NAME` FROM `origin` WHERE `COUNTRY_CODE`='$acceptlang'");
            $test=mysql_fetch_row($result);
            if ($test[0]){$paysdorigine=$test[0];}
  }
}
/*Résultat :
$paysdorigine="INCONNU"; */

Examiner le "referrer" quand il est présent et extraire le domaine du moteur de recherche peut aussi apporter un élément supplémentaire.

6. GeoIP legacy databases

Pays : UNITED STATES

Plutôt fiable avec : la plupart des grands pays.

Peu fiable avec : AOL, tele2, chello, colt, les grosses sociétés.

Code avec votre adresse IP (18.188.66.13) :

`geolite` est la table créée à partir du fichier geolite

$paysdorigine="inconnu";
$no_ip=$_SERVER["REMOTE_ADDR"]; /*$no_ip="18.188.66.13";*/
/*ou $no_ip=getenv("REMOTE_ADDR");*/
$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$res=mysql_query($serveur,"SELECT cn FROM `geolite`
WHERE inet_aton('$no_ip')>=start AND inet_aton('$no_ip')<=end;");
$ref=mysql_fetch_row($res);
if($ref[0]){$paysdorigine=$ref[0];}
/*Résultat :
$paysdorigine="UNITED STATES"; */

7. DB-IP

Pays : UNITED STATES

Plutôt fiable avec : la plupart des grands pays.

Peu fiable avec : AOL, tele2, chello, colt, les grosses sociétés.

phpwhois 4.2.2

A condition de disposer des fonctions php fsockopen() et sleep() (ce qui n'est pas le cas avec free.fr), la méthode la plus efficace si on se limite à peu de requêtes c'est celle de phpwhois.
Une requête au serveur whois concerné et toutes les informations sont transmises dans un tableau.
Le code du pays se trouvera dans le tableau $result['rawdata'].

`origin` est la table créée à partir du fichier d'ip-to-country

$query = $_SERVER["REMOTE_ADDR"]; /*$query="18.188.66.13";*/
/*ou $query=getenv("REMOTE_ADDR");*/
include_once('phpwhois-4.0.1/whois.main.php');
$whois = new Whois();
$result = $whois->Lookup($query);
$country=$result['rawdata'][index de la chaîne contenant country:];
$country_code= trim(str_replace("country:", "", $country));
//
$serveur=mysql_connect(host,username,password,database);/*Entrez ici les informations concernant votre base MySQL*/
$test=mysql_query($serveur,"SELECT DISTINCT `COUNTRY_NAME` FROM `origin` WHERE `COUNTRY_CODE`='$country_code'");
$country_name=mysql_fetch_row($test);
$paysdorigine=$country_name[0];

 
cssvalidationw3cvalidation