阻止人们刷新页面

5

有没有办法让按下F5或任何刷新按钮的用户被移动到另一个页面,而不是刷新用户想要的页面?

类似于:

If (refresh){

  goto "link to hopme page"

}

如果可以的话,有没有办法让我在某个页面上不允许刷新?

我有一些人一直在不停地刷新网页,这会消耗我的带宽。因为这是一个游戏网站,我不想禁止他们的IP地址。


为什么?你想对抗重新发送POST变量吗?使用AJAX。 - Andrejs Cainikovs
您是指当用户刷新页面,还是仅限于用户通过按下F5键来刷新页面时?请澄清。 - colithium
2
为什么你想要这样做? - Randell
4
不要使用Ajax来阻止用户重新发送POST数据——这会使没有JavaScript支持的用户无法正常使用,同时也会增加调试的难度。相反,应该使用Post-Redirect-Get模式。 - Quentin
11个回答

12

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


2
不错的选择。如果您的主机使用Apache服务器,很可能会有mod_deflatemod_gzip可供使用。正确配置后,它们将压缩文本内容(如HTML、Javascript、CSS)。如果您正在使用PHP,可以尝试使用ob_start("ob_gzhandler"); - Gav

8
session_start();
if($_SESSION['hasbeenhere'] == 1)
{
 // Page refreshed
}
else
{
   $_SESSION['hasbeenhere'] = 1;
}

如果用户没有启用cookies,这将失败。如果有人去另一个页面然后回来,它将显示为已刷新。
总的来说,你不能以确定的方式做到这一点,但这是一种防止某人看到同一页两次的方法之一。
因为你的评论,如果你想阻止人们按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.
}

如果他们转到另一页,然后再回到这一页,计数会增加吗?还是只有在刷新时才会增加?因为我不介意他们转到另一页,然后再回来。 - yaar zeigerman
试试这个。可能需要一些修改,但基本都在那里了。 - Tyler Carter
他们在30秒内只能访问特定页面100次。因此,无论他们是去还是回来,都应该在30秒内访问100次。 - Tyler Carter
如果用户没有启用cookie,这个会起作用吗? - yaar zeigerman
不行。你需要跟踪IP地址。你可能需要安装Apache IPlimit。 - Tyler Carter

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自动更新他们想看到的部分。这将激励他们不使用刷新,并帮助您的服务器通过只刷新他们想要看到的小数据块来进行处理。

3

为什么你想要这样做呢?

但是,没有一种方法可以始终有效地阻止这个问题。


我有一些人一直在不停地按F5刷新页面,这会消耗我的带宽。 - yaar zeigerman
有太多了,我想要其中大部分,这是为了一个游戏网站。 - yaar zeigerman
1
请尝试我的回答,它会屏蔽在30秒内刷新100次的人。 - Tyler Carter
1
使用Apache模块iplimit,也许可以解决问题? - mattl
模块iplimit?能解释一下吗? - yaar zeigerman
2
限制单个IP可以访问资源的次数。频繁刷新的用户将会收到错误提示,告诉他们正在错误地操作(或类似的话)。 - mattl

1

我不确定这是否可行,但你能否使用JavaScript监听按键事件,在按下F5键时执行你想要的操作。


0

我猜你可以这样做:

session_start();

if (isset($_SESSION['visited'])) {
    header("Location: http://the.page/you/want");
} else {
    $_SESSION['visited'] = true;
}

0

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

对于我来说,在处理所有 $_POST 信息并将我需要的信息保存到 $_SESSION 变量之后,我会执行以下操作:

$_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");
}

在我的情况下,我试图验证用户,但是当有人注销并返回并刷新网站时,我遇到了问题。通过这个简单的if语句,我最终解决了这个问题。
附注:"?p=redirected" 仅用于测试目的。

0
为了阻止F5刷新,您必须不允许任何类型的刷新。作为一种hack方法,您可以尝试在查询字符串中放置一个时间戳。在加载时,您可以检查时间戳的值,如果它已经过去,则重定向到另一个页面。如果禁用了cookie,则此方法可行。

@sideproject:由于链接建立的时间相对于单击链接的时间总是过去式,因此这种方法行不通。 - Andrew Moore
同意。最好选择其他解决方案。 - sideproject

0
网站本身使用JavaScript来实现这一功能,因此当您正在编辑某些内容时,不会因为刷新、返回等操作而丢失它。很可能有一些JQuery定义的事件可以让您做到这一点,因此请调查一下,在该事件上重定向到您想要的页面(可能必须在同一域内)。

0
似乎对我来说,这个问题没有好的技术解决方案(其他回答已经涵盖得很好了)。如果用户不断地刷新此页面,我猜是因为他们期望页面会变化,并且他们想要最新的信息。也许你应该消除他们想要刷新页面的原因。最简单的方法可能是通过 AJAX 使页面自动更新。这样用户就可以坐在那里,更新将自动进行——不再需要频繁按 F5,这将减少带宽占用,更好的用户体验。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接