33

PHP を使用して、自分の Web サイトで訪問者がどの国から来ているかを検出できるようにしたいと考えています。

私がこれをセキュリティ対策や何か重要な目的で使用しようとしているわけではないことに注意してください.いくつかの単語のスペルを変更しているだけです.おそらく、「国を選択してください」リストにデフォルトのオプションを与えるためです。

そのため、Geolocation データベースを使用するのは少しやり過ぎであり、このためだけに新しい PHP ライブラリをインストールすることを本当にいじりたくないので、訪問者がどの国から来たかを見つけるための最も簡単で簡単な方法は何ですか?

4

12 に答える 12

31

PHP は 5.3.0 以降、$_SERVER['HTTP_ACCEPT_LANGUAGE']変数をロケールに解析する関数を提供しています。

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

ドキュメント: https://www.php.net/manual/en/locale.acceptfromhttp.php

于 2014-03-11T19:12:30.047 に答える
21

保証はできませんが、ほとんどのブラウザーは、米国からの場合は en-us を指定する Accept-Language HTTP ヘッダーを送信します。ただし、一部の古いブラウザーは、en であるとしか言いませんでした。また、すべてのマシンがどのロケールを優先するかを示すように正しく設定されているわけではありません。しかし、それは良い最初の推測です。

English-UK ベースのユーザーは、通常、システムまたはユーザー ロケールを English-UK に設定します。これにより、既定のブラウザー構成では、Accept Language ヘッダーとして en-gb が表示されます。(これの以前のバージョンでは en-uk と書かれていました。これはタイプミスでした。申し訳ありません。) 他の国にも en-za (南アフリカ) などの en ロケールがあり、主に理論的には、en-jp のような組み合わせも可能です。

ただし、地域 IP ベースの推測は、優先言語/ロケールでは正しくない可能性があります。Google は、IP アドレスのジオロケーションに基づくコンテンツ ネゴシエーションが理にかなっていると考えています。これは、私が日本や韓国にいるときは本当にイライラします...

于 2008-11-18T01:14:23.183 に答える
13

ほとんどのブラウザーが送信するHTTP_ACCEPT_LANGUAGEヘッダー (から) を確認できます。$_SERVER

例としてZend_Localeを見てください。または、ライブラリを使用したい場合もあります。

于 2008-11-18T01:16:38.123 に答える
7

ライブラリ全体を使用しなくても、ある程度の IP 比較を行うことができます。

解決策 1

API を使用します。この方法では、何も必要ありません。これは、国を知らせる Web API です。

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

解決策 2

でも、ブラウザエージェント言語を使おうと思ったことはありますか? そこから英語の種類を知ることができるかもしれません。

解決策 3

BlockCountryと呼ばれるこの Web サイトでは、国ごとの IP のリストを確認できます。もちろん、ブロックしたくはありませんが、IP のリストを使用してそれらを比較することはできます (すべての US IP を取得します...) これは正確ではない可能性があります...

于 2008-11-18T01:12:22.920 に答える
2

$_SERVER["HTTP_ACCEPT_LANGUAGE"]国とブラウザのロケールを取得するために解析します。

于 2008-11-18T02:49:59.463 に答える
2

あなたが述べた目的を考えると、Accept-Language ヘッダーは、IP ベースのジオロケーションよりも適切なソリューションです。実際、それはまさに Accept-Language の本来の目的です。

于 2008-11-18T01:45:53.977 に答える
1

訪問者の国を識別するために、非常に使いやすいGeoIP拡張機能を使用しました。

于 2008-11-18T01:16:08.827 に答える
0

1 つは、視聴者がどの言語を希望しているか、2 番目に、どの言語を提供できるかです。

$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
    }
  }
}

たとえば、鉱山システムは次のサービスのみを提供します。

  • POSIX
  • pl_PL.UTF-8

私のブラウザ言語は pl、en-US、en => なので、正しいロケールは pl_PL.UTF-8 だけです。

成功した比較が見つからない場合 - setlocale はまったくありません。

于 2013-04-13T16:49:28.333 に答える
0

または、次の操作を実行できます。

http://www.maxmind.com/app/geoip_countryから「geoip.dat」と geoip.inc をダウンロードします。

geoip.inc ヘッダーで、それを使用する方法を見つけることができます (例: 初期化と残り...)

于 2011-05-15T08:20:22.997 に答える
0

GeoIP 拡張は適切な選択です。

于 2010-02-12T09:43:08.727 に答える
0

http://countries.nerd.dkサービスは、私が IP から国へのマッピングに使用するものです。それは本当にうまく機能し、DNSに基づいているため、キャッシュもうまくいきます.

外部サービスに依存したくない場合は、ローカルで使用するためにデータベースをダウンロードすることもできます。

于 2008-11-18T01:21:26.147 に答える