0

良い一日、

ご迷惑をおかけして申し訳ありませんが、私はすでにオプションを使い果たしました。私の Web サイトのヘッド セクションの上部に、チェコ語またはスロバキア (IP アドレス チェックに基づく) から接続した場合にチェコ語のコンテンツを取得し、残りの IP を取得することを定義 (または定義) する PHP コードがあります。アドレスは英語のコンテンツを取得します。これは、DoubleEcho 関数のパラメーターを定義することによって行われます。それは完全に機能しましたが、突然停止しました。コードの基本は大丈夫です。コンテンツを手動で切り替えることはできますが、自動選択が何らかの理由でクラッシュしました。私はいつも英語のコンテンツを手に入れます。以下のコードをご覧いただければ幸いです。よろしくお願いします。

トニー S.

<?php

// Language - URL check
if(isset($_GET['en']))
  $lang = 'en';
elseif (isset($_GET['cz']))
  $lang = 'cs';
// Language - IP check
else {
  $pc = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
  $ext = array_pop(explode('.', $pc));
  if($ext == 'cz' OR $ext == 'sk')
    $lang = 'cs';
  else
    $lang = 'en';
}

    // Language - Echo function
function DoubleEcho($text_cs, $text_en)
{
  global $lang;
  if($lang == 'cs')
    echo $text_cs;
  else
    echo $text_en;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang; ?>" lang="<?php echo $lang; ?>">
 <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-language" content="<?php echo $lang; ?>" />    
4

1 に答える 1

1

プロキシを経由するか、ロード バランサーに直接接続されている場合、IP アドレスは変化しません。

この関数は、より多くの場合に IP を検出するアイデアを提供します。

function getRemoteInfo () {
    $proxy="";
    $IP = "";
    if (isSet($_SERVER)) {
        if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $IP = $_SERVER["HTTP_X_FORWARDED_FOR"];
            $proxy  = $_SERVER["REMOTE_ADDR"];
        } elseif (isSet($_SERVER["HTTP_CLIENT_IP"])) {
            $IP = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $IP = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
            $IP = getenv( 'HTTP_X_FORWARDED_FOR' );
            $proxy = getenv( 'REMOTE_ADDR' );
        } elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
            $IP = getenv( 'HTTP_CLIENT_IP' );
        } else {
            $IP = getenv( 'REMOTE_ADDR' );
        }
    }
    if (strstr($IP, ',')) {
        $ips = explode(',', $IP);
        $IP = $ips[0];
    }
    $RemoteInfo[0]=$IP;
    $RemoteInfo[1]=@GetHostByAddr($IP);
    $RemoteInfo[2]=$proxy;
    return $RemoteInfo;
}

また、ちょっと凝ってみたい方のために、都市レベルで動作する高速な C++ geoip デーモンを作成しました。また、同じように機能する無料の国レベルもあります。

https://github.com/homer6/geoipd

于 2012-11-29T13:52:24.823 に答える