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 他们应该能够这样做而不会被重定向,无论他们在哪个国家/地区。

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

我已尝试将建议用于与回答的类似问题 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
}
?>

非常感谢任何帮助。

您可以使用 cookie 来跟踪:

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

如果蜘蛛很聪明,它们也会利用 cookie(参考: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");
}


?>