使用 php 只需一次地理重定向用户

Posted

技术标签:

【中文标题】使用 php 只需一次地理重定向用户【英文标题】:Geo redirect user just once using php 【发布时间】:2013-06-04 14:02:18 【问题描述】:

当用户登陆 site.com/redirect.php 时,我可以轻松使用此脚本 他们根据地理 IP 被重定向到适当的 TLD 但是当我在“index.php”中添加这段代码时,它会创建一个重定向循环。 你能帮我修改它,使它不会产生循环吗?现在这个“休息”没有帮助..

<?php
// Next two lines are for Beyond Hosting
// Don't forget to change your-domain
require_once '/home/your-domain/php/Net/GeoIP.php';
$geoip = Net_GeoIP::getInstance('/home/your-domain/php/Net/GeoIP.dat');

// Next two lines are for HostGator
require_once 'Net/GeoIP.php';
$geoip = Net_GeoIP::getInstance('GeoIP.dat');

try 
  $country = $geoip->lookupCountryCode($_SERVER['REMOTE_ADDR']);

  switch((string)$country) 
    case 'AU':
      $url = "http://www.site.au";
      break;
    case 'CA':
      $url = "http://www.site.ca";
      break;
    default:
      $url = "http://site.com";
  

  header('Location: '.$url);
 catch (Exception $e) 
  // Handle exception

?>

【问题讨论】:

这是一个无限循环,因为您不断将它们重定向到索引页面,该页面会检查它们所在的国家/地区,然后再次将它们重定向到索引页面。 【参考方案1】:

您应该在转发之前检查用户是否通过本地化 URL 访问该站点:

<?php
// Next two lines are for Beyond Hosting
// Don't forget to change your-domain
require_once '/home/your-domain/php/Net/GeoIP.php';
$geoip = Net_GeoIP::getInstance('/home/your-domain/php/Net/GeoIP.dat');

// Next two lines are for HostGator
require_once 'Net/GeoIP.php';
$geoip = Net_GeoIP::getInstance('GeoIP.dat');

try 
  $country = $geoip->lookupCountryCode($_SERVER['REMOTE_ADDR']);

  switch((string)$country) 
    case 'AU':
      $url = "http://www.site.au";
      break;
    case 'CA':
      $url = "http://www.site.ca";
      break;
    default:
      $url = "http://site.com";
  

  if (strpos("http://$_SERVER[HTTP_HOST]", $url) === false)
  
      header('Location: '.$url);
  
 catch (Exception $e) 
  // Handle exception

?>

【讨论】:

感谢工作就像一个魅力:) 您从哪里获得 GeoIP.php 文件?【参考方案2】:
use this  
header("Location:".$url);

【讨论】:

【参考方案3】:

你能做这样的事情吗:(警告,我没有测试过这段代码,但逻辑应该是这样的)

//Inside your try:
$country = $geoip->lookupCountryCode($_SERVER['REMOTE_ADDR']);
$serverName = explode('.', $_SERVER['SERVER_NAME']);
$serverCountryCode = $serverName[count($serverName)-1];
if (strtoupper ($serverCountryCode) != $country)) 
$shouldRedirect = true;
switch((string)$country) 
    case 'AU':
      $url = "http://www.site.au";
      break;
    case 'CA':
      $url = "http://www.site.ca";
      break;
    default:
      if ($serverCountryCode == 'com') 
        $shouldRedirect = false;
      
      $url = "http://site.com";
  
  if ($shouldRedirect) 
    header('Location: '.$url);
  

【讨论】:

以上是关于使用 php 只需一次地理重定向用户的主要内容,如果未能解决你的问题,请参考以下文章

地理上更改域保持 URL 相同

根据地理位置在首次访问时重定向用户

地理重定向上的无限循环

如何创建重定向页面到新页面

记一次URL重定向漏洞的探测脚本的优化

绕过特定目录的地理重定向