Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GeoIp2只需一次PHP重定向_Php_Redirect_Geoip - Fatal编程技术网

使用GeoIp2只需一次PHP重定向

使用GeoIp2只需一次PHP重定向,php,redirect,geoip,Php,Redirect,Geoip,我正在使用MaxMind的GeoIp2 PHP根据国家重定向网站访问者 我已设法使重定向正常工作,以便: 美国游客前往http://www.example.com/us 马来西亚游客前往http://www.example.com/my 所有其他访客进入http://www.example.com 问题是我只想重定向访问者一次。 在他们进入网站后,如果他们导航到http://www.example.com 他们应该能够做到这一点,而不必改变方向,不管他们的国家是什么 这样,人类和蜘蛛仍然可以自由

我正在使用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跟踪:

  • 如果访问者以前被重定向过
  • 访问者以前被重定向到的国家/地区
  • 如果蜘蛛很聪明,它们也会利用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");
    }
    
    
    ?>
    

    谢谢你的建议!我已经尝试过你的解决方案,但是美国访问者仍然会被重定向到/US站点。我认为问题可能在于以下代码部分,尽管我不是100%确定:如果(strpos(“http://$\u SERVER[http\u HOST]”,$url)===false){header(“Location:”.$url);}设置cookie后,它们根本不应该被重定向,它们应该转到代码的“//cookie is set no redirect”部分。如果用户浏览器未启用Cookie,则他们将一直被重定向。没错,在运行测试时使用Chrome删除Cookie时出现了一些问题。用Safari(更容易删除/检查cookie)测试了你的解决方案,一切都很顺利。我添加了一个“cookie支持”检查,但它添加了一个重定向以检测,灵感来自:对于Chrome,你只需要检查页面,切换到资源选项卡,展开cookie,单击你的域,单击cookie,然后右键单击删除