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 来跟踪:
- 如果访问者之前被重定向过
- 访问者之前被重定向到的国家
如果蜘蛛很聪明,它们也会利用 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");
}
?>
我正在使用 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 来跟踪:
- 如果访问者之前被重定向过
- 访问者之前被重定向到的国家
如果蜘蛛很聪明,它们也会利用 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");
}
?>