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:
Ü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
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);
}
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";} ?>
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