【问题标题】:Stop people from refreshing the page阻止人们刷新页面
【发布时间】:2010-11-17 02:45:29
【问题描述】:

我有没有办法让它工作,所以任何按 F5 或任何刷新按钮的人都会被移动到不同的页面,而不是刷新用户想要的页面?

类似:

If (refresh){

  goto "link to hopme page"

}

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

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

【问题讨论】:

  • 为什么?您正在尝试与重新发送 POST 变量作斗争?使用 AJAX。
  • 您是指当人们刷新页面时,还是仅当他们按 F5 刷新页面时?澄清
  • 你为什么要这样做?
  • 不要使用 Ajax 来阻止人们重新发送 POST 数据——这只会对没有 JS 的用户造成破坏,同时让调试变得更加困难。请改用 Post-Redirect-Get 模式。

标签: php refresh webpage


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    在我处理完所有 $_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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在您的 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,并且只需刷新他们希望看到更新的一小部分数据即可帮助您的服务器应对。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 好电话。如果您的主机使用 Apache 服务器,那么您很可能会拥有 mod_deflatemod_gzip 供您使用。正确配置,这些将压缩文本内容(如 HTML、Javascript、CSS)。如果您使用的是 PHP,或许可以查看ob_start("ob_gzhandler");
          【解决方案6】:
          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.
          }
          

          【讨论】:

          • 那么,如果他们转到不同的页面然后返回此页面,计数会增加吗?或者这只是为了提神?因为我不介意他们转到不同的页面然后回来
          • 那里,试试看。它可能需要稍作修改,但所有基础知识都在那里。
          • 他们只能在 30 秒内访问特定页面 100 次。所以他们去再回来都无所谓,他们应该在 30 秒内访问它 100 次。
          • 即使这个人没有启用 cookie,这也能工作吗?
          • 没有。为此,您需要跟踪 IP。您可能想要为其安装 Apache IPlimit。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • @sideproject: 因为链接的建立时间总是相对于点击链接的过去时间,所以这不起作用。
            • 同意。最好使用其他解决方案。
            【解决方案9】:

            我猜你可以这样做:

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

            【讨论】:

              【解决方案10】:

              我不知道这是否可行,但你能用 javascript 监听击键,然后按 F5 键,做你想做的事。

              【讨论】:

                【解决方案11】:

                你为什么想要?

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

                【讨论】:

                • 我有些人只是不停地按 F5 按钮,它正在扼杀我的带宽
                • 有很多,我想要其中的大部分,这是一个游戏网站。
                • 试试我的答案,它禁止在 30 秒内刷新 100 次的人。
                • 使用 Apache 模块 iplimit,也许吧?
                • dominia.org/djao/limitipconn2.html 限制单个IP可以访问资源的次数。人们不断刷新会收到一个错误,告诉他们他们做错了(或类似的词)
                猜你喜欢
                • 2019-10-06
                • 2015-08-10
                • 2017-01-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-10-26
                • 2020-06-07
                相关资源
                最近更新 更多