Wie erkennen Sie das Land eines Website-Besuchers (insbesondere USA oder nicht)?

Lesezeit: 6 Minuten

Ich muss unterschiedliche Links für US- und Nicht-US-Besucher meiner Website anzeigen. Dies dient nur der Bequemlichkeit, daher suche ich kein superhohes Maß an Genauigkeit, und Sicherheit oder Spoofing sind kein Problem.

Ich weiß, dass es Geotargeting-Dienste und -Listen gibt, aber das scheint übertrieben zu sein, da ich nur (grob) feststellen muss, ob sich die Person in den USA befindet oder nicht.

Ich habe darüber nachgedacht, JavaScript zu verwenden, um die Zeitzone des Benutzers abzurufen, aber dies scheint nur den Offset zu geben, sodass Benutzer in Kanada, Mexiko und Südamerika denselben Wert haben wie Personen in den USA.

Gibt es andere Informationen, die entweder in JavaScript oder PHP verfügbar sind, außer die IP-Adresse zu erfassen und nachzuschlagen, um dies festzustellen?

  • Ich denke, eine IP-basierte Lösung ist der einzig zuverlässige Weg. Alles andere kann durch die Einstellungen des Benutzers beeinflusst werden. IP-basierte Lösungen können auch verzerrt werden, aber es ist schwieriger.

    – FrustriertMitFormularDesigner

    28. Januar 2010 um 17:03 Uhr

  • @FrustratedWithFormsDesigner – Beachten Sie, dass er sagte: “Dies dient nur der Bequemlichkeit, daher suche ich nicht nach einem superhohen Maß an Genauigkeit, und Sicherheit oder Spoofing sind kein Problem.” Daher ist die IP-basierte Lösung für das, was er benötigt, möglicherweise zu viel des Guten. Er sagte auch: “… kurz davor, die IP-Adresse zu holen und nachzuschlagen, um dies festzustellen?”

    – Taylor Leese

    28. Januar 2010 um 17:06 Uhr


Es gibt einige kostenlose Dienste, mit denen Sie länder- und ip-basierte Geolokalisierung von der Client-Seite aus vornehmen können.

Ich habe die verwendet Wichmanie kostenloser JSONP-Dienst, es ist wirklich einfach zu bedienen:

<script type="text/javascript">
  // plain JavaScript example
  function jsonpCallback(data) { 
    alert('Latitude: ' + data.latitude + 
          '\nLongitude: ' + data.longitude + 
          '\nCountry: ' + data.address.country); 
  }
</script>
<script src="http://api.wipmania.com/jsonp?callback=jsonpCallback"
        type="text/javascript"></script>

Oder wenn Sie ein Framework verwenden, das JSONP unterstützt, wie jQuery, können Sie:

// jQuery example
$.getJSON('http://api.wipmania.com/jsonp?callback=?', function (data) { 
  alert('Latitude: ' + data.latitude + 
        '\nLongitude: ' + data.longitude + 
        '\nCountry: ' + data.address.country); 
});

Überprüfen Sie, ob das obige Snippet ausgeführt wird hier.

  • Wie könnte Ihr Code so geändert werden, dass anstelle eines Warndialogs eine URL-Umleitung erfolgt, die einen US-Besucher zu einer .COM-Adresse führt und einem kanadischen Besucher erlaubt, normal durchzukommen? (Für eine .CA-Version einer Website mit einer Schwester-Website mit .COM-Version)

    Benutzer316225

    16. Februar 2011 um 12:30 Uhr

  • switch-Anweisung im onload-Ereignis, überprüfen Sie das von der json-Funktion zurückgegebene „Land“ und rufen Sie dann Server.Transfer oder ähnliches auf.

    – Anonymer Typ

    16. Februar 2011 um 12:30 Uhr

  • Vielen Dank für den Code und den Link, es funktioniert und ist großartig 🙂

    – Mujahid

    13. Juni 2011 um 9:46 Uhr

  • Dies unterstützt kein https 🙁

    – Brian Leishmann

    7. Juni 2017 um 22:19 Uhr

  • Normalerweise verwende ich geo-ip.net/locate?query=stackoverflow.com&format=json, es unterstützt SSL-Verbindungen

    – Gerhard

    6. Juli 2018 um 10:13 Uhr

Benutzer-Avatar
Taylor Leese

Der beste Indikator ist wahrscheinlich der HTTP Accept-Language-Header. Es sieht in der HTTP-Anforderung in etwa so aus:

GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; MDDC; OfficeLiveConnector.1.4; OfficeLivePatch.0.0; .NET CLR 3.0.30729)
Accept-Encoding: gzip, deflate
Host: www.google.com
Connection: Keep-Alive

Sie sollten dies in PHP wie folgt abrufen können:

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];
?>

  • Was bestimmt Accept-Language? Wird es vom Betriebssystem festgelegt oder kann der Benutzer darauf Einfluss nehmen? Wenn mein Kollege seinen Laptop für die Verwendung von Chinesisch einrichtet, was wäre die Accept-Language? Und was ist mit en-gb?

    – FrustriertMitFormularDesigner

    28. Januar 2010 um 16:54 Uhr


  • Es wird durch die Browsereinstellungen des Benutzers bestimmt.

    – Taylor Leese

    28. Januar 2010 um 16:58 Uhr

  • @FrustratedWithFormsDesigner: Die akzeptierte Sprache wird vom Browser bestimmt. Es kann vom Benutzer manipuliert werden, wenn er dies wünscht. Gehen Sie beispielsweise unter Firefox zu Einstellungen > Inhalt > Sprachen

    – Markieren

    28. Januar 2010 um 16:59 Uhr

  • Es wird vom Browser festgelegt, der normalerweise vom Betriebssystem initialisiert wird. Während ich in Kanada bin, kann ich also so aussehen, als wäre ich in den USA, Großbritannien oder anderswo, indem ich die „Sprache“ einstelle, wie sie normalerweise in Browsern wie IE und FF genannt wird.

    – JB König

    28. Januar 2010 um 17:00 Uhr

  • Leute, insbesondere Taylor, das sieht so aus, als wäre das die Lösung, die ich brauche. Wie gesagt, es ist mir egal, ob der Benutzer vortäuscht, von woanders zu sein, das können sie natürlich gerne tun. Ich werde ihm etwas Zeit geben, um zu sehen, ob ich andere gute Optionen bekomme, aber danke!

    – David Smith

    28. Januar 2010 um 17:09 Uhr

Ich würde sagen, dass Geotargeting die einzige Methode ist, die auch nur annähernd zuverlässig ist. Es gibt aber auch Fälle, wo es überhaupt nicht hilft. Ich rufe immer wieder Websites auf, die glauben, ich sei in Frankreich, weil sich dort das Rückgrat meiner Firma befindet und der gesamte Internetverkehr darüber läuft.

Der HTTP-Accept-Header reicht nicht aus, um das Gebietsschema des Benutzers zu bestimmen. Es sagt Ihnen nur, was der Benutzer als seine Sprache ausgewählt hat, was möglicherweise nichts damit zu tun hat, wo er sich befindet. Mehr dazu hier.

Wipmania.com & PHP

<?php
$site_name = "www.your-site-name.com";

function getUserCountry() {
    $fp = fsockopen("api.wipmania.com", 80, $errno, $errstr, 5);
    if (!$fp) {
        // API is currently down, return as "Unknown" :(
        return "XX";
    } else {
        $out = "GET /".$_SERVER['REMOTE_ADDR']."?".$site_name." HTTP/1.1\r\n";
        $out .= "Host: api.wipmania.com\r\n";
        $out .= "Typ: php\r\n";
        $out .= "Ver: 1.0\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            $country = fgets($fp, 3);
        }
        fclose($fp);
        return $country;
    }
}
?>

@rostislav

oder mit cURL:

public function __construct($site_name) {
    // create a new cURL resource
    $ch = curl_init();

    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
    curl_setopt($ch, CURLOPT_URL, "http://api.wipmania.com".$_SERVER['REMOTE_ADDR']."?".$site_name);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // grab URL and pass it to the browser
    $response = curl_exec($ch);
    $info = curl_getinfo($ch,CURLINFO_HTTP_CODE);

    if (($response === false) || ($info !== 200)) {
        throw new Exception('HTTP Error calling Wipmania API - HTTP Status: ' . $info . ' - cURL Erorr: ' . curl_error($ch));
    } elseif (curl_errno($ch) > 0) {
        throw new Exception('HTTP Error calling Wipmania API - cURL Error: ' . curl_error($ch));
    }

    $this->country = $response;

    // close cURL resource, and free up system resources
    curl_close($ch);
}

Benutzer-Avatar
sameeuor

Wir können einfach Hostip API verwenden

<?php $country_code = file_get_contents("http://api.hostip.info/country.php"); <br/>if($country_code == "US"){ echo "You Are USA"; } <br/>else{ echo "You Are Not USA";} ?>

Alle Ländercodes sind hier..
http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Benutzer-Avatar
Leonardo Ciaccio

Meine Lösung, einfach und klein, in diesem Beispiel teste ich die Region Kanada aus der Sprache fr-CA or en-CA

if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){

   $region = "Canada";

}

1229110cookie-checkWie erkennen Sie das Land eines Website-Besuchers (insbesondere USA oder nicht)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy