我似乎无法理解为什么以下将所有流量发送到未找到页面的页面,即使Paypal推荐也是如此。有什么想法吗?
$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 :(得分: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
答案 1 :(得分:1)
您确定HTTP_REFERER
已设定吗?如果你看一下它所说的documentation
将用户代理引用到当前页面的页面地址(如果有)。这是由用户代理设置的。并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER修改为功能。简而言之,它无法真正被信任。
答案 2 :(得分:0)
这是对的吗?
$urlToCheck = $Exploded[3];
如果您的请帖看起来像http://www.example.com/ .... 通过“/”爆炸,你将永远不会在第三个索引中获得域名。应该是2。
尝试使用
$urlToCheck = $Exploded[2];