2015-05-27 3 views
2

Я использую MaxMind's GeoIp2 PHP для перенаправления посетителей сайта по их стране.PHP Перенаправление только один раз с помощью GeoIp2

мне удалось получить редирект работает так, что:
США посетители идут в 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

Вы можете использовать куки для отслеживания:

  1. если посетитель был перенаправлен до того
  2. страну, что посетитель был перенаправлен до

Если пауки умные, они также будут использовать куки (Ref: 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"); 
} 


?> 
+0

Спасибо за совет! Я пробовал ваше решение, но посетители из США все еще продолжают перенаправляться на сайт/us. Я думаю, что проблема, вероятно, заключается в следующем разделе кода, хотя я не уверен на 100%: if (strpos («http: // $ _ SERVER [HTTP_HOST]», $ url) === false) {3 header («Местоположение:». $ Url); } – Leb

+0

Они не должны перенаправляться вообще, как только cookie установлен, они должны перейти в раздел кода «// cookie is not redirect». Если в браузере пользователей не разрешены файлы cookie, они будут перенаправляться все время. – AEQ

+0

Вы правы, были проблемы с удалением файлов cookie с помощью Chrome при запуске тестов. Протестировано ваше решение с помощью Safari (проще удалить/проверить файлы cookie), и все работает как шарм. – Leb

Смежные вопросы