PHP使用GeoIp2重定向一次

时间:2015-05-27 03:14:08

标签: php redirect geoip

我正在使用MaxMind的GeoIp2 PHP根据他们的国家/地区重定向网站访问者。

我设法让重定向工作,以便: 美国访客前往http://www.example.com/us 马来西亚游客前往http://www.example.com/my 所有其他访问者都会转到http://www.example.com

问题是我只想重定向一次访问者。 在他们访问网站后,如果他们导航到http://www.example.com 无论他们的国家如何,他们都应该能够这样做而不会被重定向。

这样人类和蜘蛛仍然可以自由访问不针对其国家的网页。

我已尝试将此建议用于回答here的类似问题 但问题是关于不同国家的不同域而不是不同的路径,所以解决方案对我不起作用。

代码:

<?php 
require_once '../vendor/autoload.php';
use GeoIp2\Database\Reader;

$reader = new Reader('/usr/local/share/GeoIP/GeoLite2-Country.mmdb');

$record = $reader->country( $_SERVER['REMOTE_ADDR'] );

try {
  $country = $record->country->isoCode;

  switch((string)$country) {
    case 'US':
      $url = "http://www.example.com/us";
      break;
    case 'MY':
      $url = "http://www.example.com/my";
      break;
    default:
      $url = "http://www.example.com";
  } 

  if (strpos("http://$_SERVER[HTTP_HOST]", $url) === false)
  {
      header("Location: ".$url);
  }

} catch (Exception $e) {
  // Handle exception
}
?>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用Cookie来跟踪:

  1. 如果访问者在
  2. 之前被重定向
  3. 访问者之前被重定向到的国家
  4. 如果蜘蛛很聪明,他们也会使用这些饼干(参考:Can Bots/Spiders utilize Cookies?)。

    所以你可以写出你的逻辑:

    <?php 
    require_once '../vendor/autoload.php';
    use GeoIp2\Database\Reader;
    
    $cookie_name = "country_code";
    session_start();
    
    
    if (isset($_GET['check']) && $_GET['check'] == true) {
    
      if (isset($_COOKIE['test_cookie']) && $_COOKIE['test_cookie'] == 'test') {
    
        if(!isset($_COOKIE[$cookie_name])) {
    
          $reader = new Reader('/usr/local/share/GeoIP/GeoLite2-Country.mmdb');
    
          $record = $reader->country( $_SERVER['REMOTE_ADDR'] );
    
          try {
    
            $country = $record->country->isoCode;
    
            switch((string)$country) {
              case 'US':
                $url = "http://www.example.com/us";
                break;
              case 'MY':
                $url = "http://www.example.com/my";
                break;
              default:
                $url = "http://www.example.com";
            } 
    
            $cookie_value = "" . (string)$country;
    
            setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
            if(!isset($_GET['cookies'])){
    
              header('Location:/info.php?cookies=true');
            }
            if (strpos("http://$_SERVER[HTTP_HOST]", $url) === false)
            {
                header("Location: ".$url);
            }
    
          } catch (Exception $e) {
            // Handle exception
          }
    
        } else { //cookie is set no redirect
    
        }
    
      } else { //no cookie support, no redirect
    
      }
    
    } else {
    
      setcookie('test_cookie', 'test', time() + 3600);
    
      header("location: {$_SERVER['PHP_SELF']}?check=true");
    }
    
    
    ?>