2013-02-28 139 views
1

我似乎無法解決爲什麼下面的所有流量發送到頁面未找到的頁面,即使通過貝寶引用。有任何想法嗎?PHP referer網址和重定向

$refererUrl = $_SERVER['HTTP_REFERER']; 
$Exploded = explode("/",$refererUrl); 
$urlToCheck = $Exploded[3]; 
$findURL = strpos($urlToCheck,'paypal.com'); 
if($findURL === false){ 
    header('location:/page-not-found'); 
} else { 
/* Do something if page referred to by Paypal */ 
} 
+0

是'$ _ SERVER [ 'HTTP_REFERER']'實際上是在你的服務器設置? – Boaz 2013-02-28 12:13:45

+0

'$ _SERVER ['HTTP_REFERER']'由用戶代理(在您的瀏覽器中)設置,並且不能被信任爲您期望的值。我建議你調試這個值。 – 2013-02-28 12:14:47

回答

3

您檢查是否'paypal.com'存在於$Exploded[3]嘗試。你爲什麼期望引用URL的那部分是主機名?數組索引從0開始,因此從左到右計數會給出以下結果,表明2將是正確的索引。

$Exploded = explode('http://www.google.com/?q=foobar', '/'); 

// $Exploded now contains: 
0: http: 
1: 
2: www.google.com 
3: ?q=foobar 

但是,使用某些實用程序來解析任意URL並從解釋的URL中讀取主機名會更安全。你可以這樣做(未經測試):

$referer = parse_url($_SERVER['HTTP_REFERER']); 
if($referer['host'] != 'paypal.com') 
    header('location:/page-not-found'); 
else 
    /* Do something if page referred to by Paypal */ 

parse_url DOC:http://php.net/manual/en/function.parse-url.php

+0

完美。謝謝,你說得對,它是2,而不是3.哎呀! – ggdx 2013-02-28 12:22:55

+0

您能標記爲回答嗎? :) – Korijn 2013-02-28 12:25:47

+0

它說剩下44秒。只要時鐘達到0就會盡快完成 – ggdx 2013-02-28 12:26:21

1

您確定HTTP_REFERER已設置?如果你看看documentation它說

引用用戶代理到當前頁面的頁面地址(如果有的話)。這由用戶代理設置。並非所有的用戶代理都會設置它,有些提供了將HTTP_REFERER修改爲功能的功能。總之,它不能真正被信任。

0

它是正確的嗎?

$urlToCheck = $Exploded[3]; 

如果您reffer看起來像http://www.example.com/ .... 了由在第3索引「/」你永遠不會得到域爆炸。它應該是2

使用

$urlToCheck = $Exploded[2]; 
+0

是的,對不起,它意味着是2,而不是3.現在工作很好。乾杯! – ggdx 2013-02-28 12:25:21