Frage

Ich möchte in der Lage sein, zu erkennen, aus welchem Land ein Besucher von meiner website mit PHP.

Bitte beachten Sie, dass ich bin nicht versuchen zu verwenden Sie dieses als Sicherheitsmaßnahme oder für alles, was wichtig ist, ändern Sie einfach die Schreibweise einiger Wörter (Amerikaner scheint zu glauben, dass das Wort "Immatrikulation" hat 2 Ls....verrückte Amis), und vielleicht geben Sie eine Standard-option in einem "Wählen Sie Ihr Land" - Liste.

Als solche, mit einem Geolocation-Datenbank ist ein bisschen over-the-top und ich möchte wirklich nicht, um dreck über mit der Installation von PHP-Bibliotheken, die nur für diese, so was ist der einfachste/einfachste Weg, um herauszufinden, in welchem Land ein Besucher aus?

War es hilfreich?

Lösung

Nicht garantiert, aber die meisten Browser senden Sie eine HTTP-Accept-Language-header, der angibt, en-us, wenn Sie aus den USA.Einige ältere Browser nur gesagt, Sie en, wenn.Und nicht alle Geräte korrekt eingerichtet sind, um anzuzeigen, welche locale Sie bevorzugen.Aber es ist eine gute erste Vermutung.

Deutsch-Britisches-Nutzer in der Regel legen Sie Ihre system-oder Benutzer-Gebietsschema auf Englisch-UK, die in Standard-browser-Konfigurationen führen sollte, in de wie der Accept-Language-header.(Eine frühere version dieser sagte de-uk;das war ein Tippfehler, sorry.) Andere Länder haben auch en-Gebietsschemas, wie beispielsweise en-za (Südafrika), und, in Erster Linie theoretisch, Kombinationen wie en-jp sind auch möglich.

Geo-IP-basierte Vermutungen wird weniger wahrscheinlich sein, korrigieren Sie auf die gewünschte Sprache/Gebietsschema, aber.Google meint, dass content-negotiation-basierend auf der IP-Adresse geolocation Sinn macht, was mich echt nervt, wenn ich in Japan oder Korea...

Andere Tipps

PHP bietet eine Funktion, die seit 5.3.0 analysieren die $_SERVER['HTTP_ACCEPT_LANGUAGE'] - variable in eine locale.

http://www.php.net/manual/en/locale.acceptfromhttp.php

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"

Sie können sich die HTTP_ACCEPT_LANGUAGE header - (von $_SERVER), dass die meisten Browser sendet.

Werfen Sie einen Blick auf Zend_Locale für ein Beispiel, oder vielleicht könnten Sie sogar wollen, verwenden Sie die lib.

Sie können tun einige IP-comparaison ohne eine ganze Bibliothek, es zu tun.

Lösung #1

Verwenden Sie eine API, auf diese Weise wird nichts benötigt von Ihrer Seite.Dies ist eine web-API, die Sie wissen lassen, die Land:

 Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
 Return : Country: UNITED STATES (US)

Lösung #2

Aber Haben Sie denken, Sie über die browser-agent-Sprache?Sie könnten in der Lage sein, zu wissen, welche Art von Englisch Sie es aus.

Lösung #3

Diese Webseite aufgerufen BlockCountry lassen Sie Sie haben eine Liste von IP nach Land.Natürlich, Sie wollen nicht blockieren, aber Sie können die Liste der IP und vergleichen Sie Sie (bekommen alle US-IP...), es könnte nicht genau sein...

Angesichts Ihrer angegebenen Zweck, den Accept-Language-header ist eine geeignetere Lösung als IP-basierte Geolokalisierung.In der Tat, es ist genau der beabsichtigte Zweck Accept-Language.

Parse $_SERVER["HTTP_ACCEPT_LANGUAGE"], um Land und den browser-Gebietsschema

Für die Identifizierung Ihrer Besucher Land, das ich verwendet habe GeoIP Erweiterung, die sehr einfach zu bedienen.

Ich benutze das HTTP_ACCEPT_LANGUAGE

    $localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if(is_array($localePreferences) && count($localePreferences) > 0) {
       $browserLocale = $localePreferences[0];
       $_SESSION['browser_locale'] = $browserLocale;
    }

Die http://countries.nerd.dk service ist das, was ich für IP-zu-Land-mapping.Es funktioniert wirklich gut, und basiert auf DNS, wird zwischengespeichert, auch gut.

Sie können auch download-Datenbank für die lokale Anwendung, wenn Sie nicht wollen, zu verlassen an einem externen service.

Oder Sie können tun die folgenden:

download 'geoip.dat' und geoip.inc http://www.maxmind.com/app/geoip_country

in der geoip.inc-header finden Sie, wie es zu benutzen (zB.initialisieren und den rest...)

GeoIP extension ist eine gute Wahl.

Eine Sache ist, welche Sprache der Betrachter will, zweites -, die Sie dienen kann:

$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {         
  list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
  for($j=0;$j<count($SystemLocales);$j++) {
    if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
      setlocale(LC_ALL, $SystemLocales[$j]);
      break 2; // found and set, so no more check is needed
    }
  }
}

für Beispiel, mine-system dient nur:

  • C
  • POSIX
  • pl_PL.UTF-8

und meine browser-Sprachen sind:pl, en-US, en => also ist der einzige richtige Gebietsschema ist pl_PL.UTF-8.

Bei nicht erfolgreichem Abgleich wird gefunden - es gibt keinen setlocale überhaupt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top