2013-04-30 135 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; 
    } 
?>