我的网站上有一个go.php文件,用于跟踪某些链接的点击次数,我只想计算在我的网站上发出的点击次数,而不是其他复制该链接的网站上的点击次数(site.com/go。 PHP?ID =)。我试过这段代码
if($_SERVER[HTTP_REFERER] && !preg_match("/site\.com/", $_SERVER[HTTP_REFERER])) {
header("Location: http:// www .site.com");
die();
}
但无法正常工作,其他网站的点击次数也会计算在内。有没有办法只计算我网站上的点击次数?
编辑:我格式化了代码,但我将http://
和www
附近的空格留下了。 -gore
答案 0 :(得分:2)
$_SERVER[HTTP_REFERER]
不值得考虑,因为不能保证它会被用户发送。它的价值也可能会被修改。
您可以使用使用唯一令牌的相当常见的技术:
//some-file.php:
$uniqueToken = substr(sha1(uniqid()), 0, 8); // 8-characters long unique token, eg "2fac223a"
$_SESSION['token'] = $uniqueToken;
// ...
<a href="go.php?id=123&token=<?php echo $uniqueToken ?>">Click here</a>
//go.php:
if (!isset($_GET['token']) || $_SESSION['token'] !== $_GET['token']) {
// invalid request
exit;
}
// ...
答案 1 :(得分:1)
$_SERVER['HTTP_REFERER']
变量,最好是可选的,甚至是用户可设置的,因此不是严重的信息来源。你以前在另一个页面上设置了一个cookie(你可能想要使用浏览器端的cookie,而不是服务器端$_SESSION
,它可以在默认的30分钟内到期)然后检查该信息会告诉你是否他们在登陆“go.php”页面之前访问了网站上的其他页面。
答案 2 :(得分:1)
我认为你在这里找到了正确的想法。在我看来,使用正则表达式可能会有点痛苦,所以也许这会更简单:
<?php
//make sure to use !== rather than != with strpos
if(strpos($_SERVER['HTTP_REFERER'], 'site.com') !== false){
//if you're here, you've got a match for site.com
}
?>
我希望这有用。
答案 3 :(得分:1)
如果您想尝试与$ _SERVER ['HTTP_REFERER']不同的路由或设置cookie /会话,您可以在登录页面上编写一个脚本,该脚本将检查Apache访问日志以查看请求的IP地址是否只是之前正在访问您的一个链接页面...这应该可以正常工作,即使他们已关闭cookie或尝试伪造推荐人,并且没有可见的网址令牌