Geo Redirect 无限循环
Infinite loop on Geo Redirect
我有 3 个针对不同地区的网站,它们有自己的位置特定内容:
- 法语网站:http://dev.logichub.net/demo/fr/
- 德语网站:http://dev.logichub.net/demo/de/
- 默认网站:http://dev.logichub.net/demo/
我想根据访问者的 IP 地址将访问者重定向到相应的网站。例如,如果用户从德国登陆 http://dev.logichub.net/demo/fr/,则必须将 he/she 重定向到德国网站,即 http://dev.logichub.net/demo/de/。我想在所有 3 个网站上实施相同的行为。
我在这3个网站的主页上放了下面的代码:
// get visitor IP address and process
$geo_data = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']) );
if ( ! empty( $geo_data ) ) {
switch ( $geo_data['geoplugin_countryCode'] ) {
// redirect French visitors to FR website
case "FR":
echo '<script>window.location.replace( "http://dev.logichub.net/demo/fr/" );</script>';
break;
// redirect German visitors to DE website
case "DE":
echo '<script>window.location.replace( "http://dev.logichub.net/demo/de/" );</script>';
break;
// redirect all others to international website
default:
echo '<script>window.location.replace( "http://dev.logichub.net/demo/" );</script>';
}
}
除了重定向网站上的无限循环外,它完全按照我想要的方式工作。访问者被完美重定向,但新网站永远加载。我怎样才能停止无限循环,以便一旦访问者重定向到正确的网站,就不会再发生重定向?
在尝试重定向之前,您必须检查用户是否在正确的域中。这是完全在 PHP:
中完成的解决方案
<?php
session_start();
$currentUrl = explode('/', "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
$currentCountry = isset($currentUrl[4]) ? $currentUrl[4] : '';
if(empty($_SESSION['country'])) {
$geo_data = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']) );
if(!empty($geo_data)) {
$country = $geo_data['geoplugin_countryCode'];
$_SESSION['country'] = $country = ($country != 'FR' || $country != 'DE') ? '' : $country;
}
}
if($currentCountry != $_SESSION['country'])
header('Location: http://dev.logichub.net/demo/'.$country);
您可以通过获取当前国家/地区而不在 URL 中搜索它来改进此代码(例如,通过在文件中定义它),但实际上,它应该工作得更好。
我有 3 个针对不同地区的网站,它们有自己的位置特定内容:
- 法语网站:http://dev.logichub.net/demo/fr/
- 德语网站:http://dev.logichub.net/demo/de/
- 默认网站:http://dev.logichub.net/demo/
我想根据访问者的 IP 地址将访问者重定向到相应的网站。例如,如果用户从德国登陆 http://dev.logichub.net/demo/fr/,则必须将 he/she 重定向到德国网站,即 http://dev.logichub.net/demo/de/。我想在所有 3 个网站上实施相同的行为。
我在这3个网站的主页上放了下面的代码:
// get visitor IP address and process
$geo_data = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']) );
if ( ! empty( $geo_data ) ) {
switch ( $geo_data['geoplugin_countryCode'] ) {
// redirect French visitors to FR website
case "FR":
echo '<script>window.location.replace( "http://dev.logichub.net/demo/fr/" );</script>';
break;
// redirect German visitors to DE website
case "DE":
echo '<script>window.location.replace( "http://dev.logichub.net/demo/de/" );</script>';
break;
// redirect all others to international website
default:
echo '<script>window.location.replace( "http://dev.logichub.net/demo/" );</script>';
}
}
除了重定向网站上的无限循环外,它完全按照我想要的方式工作。访问者被完美重定向,但新网站永远加载。我怎样才能停止无限循环,以便一旦访问者重定向到正确的网站,就不会再发生重定向?
在尝试重定向之前,您必须检查用户是否在正确的域中。这是完全在 PHP:
中完成的解决方案<?php
session_start();
$currentUrl = explode('/', "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
$currentCountry = isset($currentUrl[4]) ? $currentUrl[4] : '';
if(empty($_SESSION['country'])) {
$geo_data = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip=' . $_SERVER['REMOTE_ADDR']) );
if(!empty($geo_data)) {
$country = $geo_data['geoplugin_countryCode'];
$_SESSION['country'] = $country = ($country != 'FR' || $country != 'DE') ? '' : $country;
}
}
if($currentCountry != $_SESSION['country'])
header('Location: http://dev.logichub.net/demo/'.$country);
您可以通过获取当前国家/地区而不在 URL 中搜索它来改进此代码(例如,通过在文件中定义它),但实际上,它应该工作得更好。