PHP用GeoIp2重定向一次


PHP Redirect just once with GeoIp2

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

我已经设法使重定向工作,以便:
美国游客前往http://www.example.com/us
马来西亚游客前往http://www.example.com/my
所有其他访客都去http://www.example.com

问题是我只想重定向访问者一次。在他们进入网站后,如果他们浏览到http://www.example.com他们应该能够做到这一点,而不会被重定向,无论他们在哪个国家。

这是为了让人类和蜘蛛仍然可以自由访问非针对他们国家的网页。

我已经尝试用这个建议来解决一个类似的问题但问题是,不同的国家有不同的域名,而不是不同的路径,所以这个解决方案不适合我。

代码:

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

您可以使用cookie来跟踪:

  1. 如果访问者在
  2. 之前被重定向
  3. 访问者在
  4. 之前被重定向到的国家

如果蜘蛛很聪明,它们也会利用cookie(参考:机器人/蜘蛛可以利用cookie吗?)

所以你可以这样写你的逻辑:

<?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");
}

?>