5

无论如何,我是否可以让它工作,所以任何按 F5 或任何刷新按钮的人都会被移动到不同的页面,而不是刷新用户想要的页面?

就像是 :

If (refresh){

  goto "link to hopme page"

}

如果没有,我是否不允许在某个页面上刷新?

我有一些人正在不停地刷新,这正在扼杀我的带宽。这是一个游戏网站,所以我不想禁止IP。

4

11 回答 11

12

也许您应该将精力集中在减少页面使用的带宽上。探索图像压缩、页面优化和缓存领域。

于 2009-08-05T18:27:26.007 回答
8
session_start();
if($_SESSION['hasbeenhere'] == 1)
{
 // Page refreshed
}
else
{
   $_SESSION['hasbeenhere'] = 1;
}

如果此人未启用 cookie,则此操作将失败。如果有人转到另一个页面并返回,它将显示为刷新。

总体而言,您不能以万无一失的方式执行此操作,但这是防止某人两次看到同一页面的一种方法。

因为你的评论,如果你想阻止人们按 F5 200 次,试试这个。

$page = $_SERVER['REQUEST_URI'];
// Defaults
if(!isset($_SESSION[$page]['count']))
{
    $_SESSION[$page]['count'] = 1;
    $_SESSION[$page]['first_hit'] = time();
    $_SESSION[$page]['banned'] = false;
}
else
{
    $_SESSION[$page]['count']++; // Increase the counter
}

// If person is banned, end script
if($_SESSION[$page]['banned'] == true)
{
    die();
}

if($_SESSION[$page]['first_hit'] < time() - 30)
{
    $_SESSION[$page]['count'] = 1; // Reset every 30 seconds
}

if($_SESSION[$page]['count'] > 100)
{
    $_SESSION[$page]['banned'] = true; 
    // Ban if they hit over 100 times in 30 seconds.
}
于 2009-08-05T18:09:55.697 回答
3

你为什么想要?

但是不,没有办法可以持续工作来阻止这种情况。

于 2009-08-05T18:08:53.843 回答
3

在您的 PHP 代码中,执行以下操作:

 if(isset($_SESSION["pagename-LAST_VIEWED"])) {
    v = $_SESSION["pagename-LAST_VIEWED"])
    if(time() - v < 15) {
       // user is refreshing more than once per 15 seconds
       // send them something else and die
       }
 }
 $_SESSION["pagename-LAST_VIEWED"] = time();

请忽略我蹩脚的伪 PHP,它不是我的日常语言。

这将防止页面刷新 (F5)用户再次单击书签或再次在地址栏中按 Enter 键。

您还可以启用一些激进的缓存元标记和 HTTP 标头,这将防止某些刷新访问您的服务器,但上面的代码应该是相当可扩展的。

要考虑的另一件事:根本问题是您的其他代码,而不是您的用户。考虑重写您的页面,以便在定时延迟时自动更新他们希望通过 AJAX 查看的部分。这将激励他们不使用 Refresh,并且只需刷新他们希望看到更新的一小部分数据即可帮助您的服务器应对。

于 2009-08-05T18:31:31.443 回答
1

我不知道这是否可行,但你能用 javascript 听击键吗?在 F5 按键上,做你想做的事。

于 2009-08-05T18:09:49.723 回答
0

我想你可以这样做:

session_start();

if (isset($_SESSION['visited'])) {
    header("Location: http://the.page/you/want");
} else {
    $_SESSION['visited'] = true;
}
于 2009-08-05T18:11:25.507 回答
0

为了阻止 F5 刷新,您必须不允许任何类型的刷新。作为 hack,您可以尝试在查询字符串中添加时间戳。在加载时,您可以检查时间戳的值,如果它是过去的,则重定向到另一个页面。如果 cookie 被禁用,这将起作用。

于 2009-08-05T18:12:47.987 回答
0

该站点本身使用 Javascript 执行此操作,因此当您编辑某些内容时,您不会因为刷新、返回等而丢失它。可能有一些由 JQuery 定义的事件可以让您执行此操作,因此请查看它,然后继续该事件,重定向到您想要的页面(可能必须在同一个域内)。

于 2009-08-05T18:14:30.557 回答
0

在我看来,这个问题没有好的技术解决方案(其他答案很好地涵盖了这一点)。如果用户在此页面上不断刷新,我猜这是因为他们希望页面发生变化并且他们想要最新的信息。也许您应该取消他们想要刷新页面的理由。最简单的方法可能是让页面自行更新(可能通过 AJAX)。因此,用户可以坐在那里,更新将滚滚而来——不再敲击 F5,这将减少您的带宽,更不用说提供更好的用户体验了。

于 2009-08-05T19:21:29.733 回答
0

它没有直接回答您的问题,但您可能可以通过缓存解决您的问题,不是吗?

如果您发送标头 Cache-Control: public,max-age=120 这应该指示浏览器在 2 分钟内不需要再次请求该页面,并且可以使用缓存中的副本。如果他们当然可以使用 control-f5 强制刷新,但它应该有很大帮助吗?

于 2009-08-05T19:32:50.727 回答
0

我只是找到了一个非常简单的解决方案。

对我来说,在我处理完所有 $_POST 信息并将我需要的信息保存到 $_SESSION var 之后,我会这样做:

$_SESSION['admin']['PID']=session_id();
$_SESSION['admin']['user_user']=$_POST['user'];
$_SESSION['admin']['user_pass']=$_POST['pass'];
$_SESSION['admin']['last_access_time']=time();
if($_SERVER['REQUEST_METHOD']==="POST")
{
    header("LOCATION:".$_SERVER['PHP_SELF']."?p=redirected");
}

在我的情况下,我试图验证用户,我遇到的问题是,当有人注销并返回并再次刷新站点加载时,如果我最终解决了这个问题,这很简单。

PD: ."?p=redirected" 仅用于测试 porpouse

于 2013-12-22T01:05:26.130 回答