2013-04-30 138 views
0

有人可以请检查这一点的代码。我知道我可以使用/i来使这种情况下不敏感。但是,即使我不是,我仍然会吸引肯定有$ user_agent设置的访问者,但是通过这一点我不能理解为什么。分裂preg_match或其他东西

<?php 
$user = $_SERVER['HTTP_USER_AGENT']; 
if(preg_match("/android|linux|windows|Android|Linux|Windows/",$user)) { 
header("Refresh:0;url=http://site.com/page.php/"); 
}; 
?> 

<?php 
$referrer = $_SERVER['HTTP_REFERER']; 
if(preg_match("/term-one|term-two|term-three/",$referrer)) { 
header("Refresh:0;url=http://site.com/page.php/"); 
exit; 
} 
?> 
+0

如果事情越来越近的正则表达式应该被抓,一些日志为什么不添加到末尾呼应了什么他们的用户代理或Referer的是什么? – andrewsi 2013-04-30 13:29:03

+0

愚蠢的问题,但如果你确定他们有USER_AGENT设置,你是否也确定这个值包含你的3个匹配中的一个 – fullybaked 2013-04-30 13:29:04

+0

欺骗用户代理很容易,也许这就是一些用户滑过的原因? – HamZa 2013-04-30 13:59:45

回答

0

后你的第一个电话header()你缺少一个exit;声明。 如果它通常仍然可以正常工作,但是您的代码将继续执行,并且如果稍后在我们的代码中重新设置标头Refresh,则第一次重定向将不会发生。

此外,由于刷新发生在页面加载完成后,您缺少的exit意味着您继续加载内容 - 包括大概是谷歌分析代码,然后即使它们最终刷新到正确的页面,他们Google Analytics(分析)会记录下来,因为已经先载入了这个页面。

为什么要使用Refresh标题而不是Location标题进行重定向?

我推荐的代码将是:

<?php 
    $user = $_SERVER['HTTP_USER_AGENT']; 
    if (preg_match("/android|linux|windows/i", $user)) { 
     header("Location: http://site.com/page.php"); 
     exit; 
    } 
    $referrer = $_SERVER['HTTP_REFERER']; 
    if (preg_match("/term-one|term-two|term-three/", $referrer)) { 
     header("Location: http://site.com/page.php"); 
     exit; 
    } 
?>