0

再会,

很抱歉给您带来麻烦,但我已经没有选择了。在我的网站上,在头部分的顶部,我有一个 PHP 代码,它定义(或定义)如果您从捷克或斯洛伐克连接(基于 IP 地址检查),您将获得捷克内容,其余 IP地址将获得英文内容。这是通过定义 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 回答