“此网页有一个重定向循环”(使用 GeoIP 重定向网站)

Posted

技术标签:

【中文标题】“此网页有一个重定向循环”(使用 GeoIP 重定向网站)【英文标题】:"This webpage has a redirect loop" (redirect website with GeoIP) 【发布时间】:2014-01-08 13:29:56 【问题描述】:

我正在尝试向我的网站添加一些代码,以便根据用户的 IP 地址重定向用户。无论我做什么,我都会收到“此网页有重定向循环”消息。

这是我的代码:

if(isset($_GET['FirstTimer']))
    setcookie('FirstTimer','something',strtotime('+1 year'),'/');
    $_COOKIE['FirstTimer']='something'; 


require_once('geoip.inc');

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);

if(!isset($_COOKIE['FirstTimer'])): 
    if($_SERVER['REQUEST_URI'] == '/') 
        switch((string)$country) 
            case 'GR':
                header('Location: http://mywebsite.com/');
                break;
            case 'RU':
                header('Location: http://mywebsite.com/ru');
                break;
            default:
                header('Location: http://mywebsite.com/en');
        
    
endif;

geoip_close($gi);

“FirstTimer”cookie 用于确定访问者是否是新访问者(因为我只想重定向新访问者)。

代码放在我的index.php文件的顶部,'\'标签前没有空格。

【问题讨论】:

if(!isset($_COOKIE['FirstTimer'])): 之前直接尝试die($_COOKIE['FirstTimer']); 看看是否有意义 我试过了,加载了空白页。 很好,所以它是空的。为什么您帖子第 1 行的代码未正确设置 $_COOKIE['FirstTimer'] 改用die('<pre>'.print_r($_COOKIE, true).'</pre>'); 我更新了我的答案。看看它。这是另一种观点,因为我认为您在第一次访问时设置查询参数不会有太多运气。 【参考方案1】:

我假设 $_GET['FirstTimer'] 没有设置。所以你的开关总是被执行。

当 geoip 返回 GR 时,您的脚本将再次重定向到 http://mywebsite.com/$_SERVER['REQUEST_URI'] 返回/,你又回到了你的开关中。

这是你的循环。

编辑

我稍微修改了你的脚本。如果用户第一次访问,则不要记录,这没有任何意义,只需记录用户上次访问的时间。 如果未设置此 cookie,请启动 geoip 并重定向用户。如果已设置,请更新时间。

if(!isset($_COOKIE['last_visit'])) 
    setcookie('last_visit',date("Y-m-d H:i:s"),strtotime('+1 year'),'/');

    require_once('geoip.inc');

    $gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
    $country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    if($_SERVER['REQUEST_URI'] == '/') 
        switch((string)$country) 
            case 'GR':
                header('Location: http://mywebsite.com/');
                break;
            case 'RU':
                header('Location: http://mywebsite.com/ru');
                break;
            default:
                header('Location: http://mywebsite.com/en');
        
    

    geoip_close($gi);
 else 
    setcookie('last_visit',date("Y-m-d H:i:s"),strtotime('+1 year'),'/');

但是您绝对应该增强此脚本,因为如果您的用户使用以下内容进入您的页面,会发生什么情况:http://yourwebsite.com/great/article/link.html。 也许您确实对此有翻译,但不会重定向用户。

【讨论】:

你的意思是我应该完全移除'GR'案例? 不,我假设 $_GET['FirstTimer'] 没有在开始时设置,并且您的 cookie 没有创建。所以检查为什么。即使已设置,也无法到达您的开关。 我现在可以看到问题在于 cookie 而不是重定向。我根据这里的 cmets 自己更改了代码并且它有效。无论如何,您的代码版本比我的更好:)谢谢!

以上是关于“此网页有一个重定向循环”(使用 GeoIP 重定向网站)的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 Django 中的静态 HTML 文件? (重定向前需要登录)

如何为 IPv6 使用 geoip 数据?

GeoIP + Django,无效的 GeoIP 城市数据文件

使用 puppet 安装 nginx + geoip

在 Nginx 和 UWSGI 中使用 GeoIP 模块

如何使用 Geoip 在 NodeJs 上获取当前城市名称