2013-02-28 58 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