【问题标题】:How do I make Firefox reload page when back button is pressed?按下后退按钮时如何使 Firefox 重新加载页面?
【发布时间】:2011-06-05 13:17:56
【问题描述】:

我已经尝试了应该阻止页面被缓存的元标记的所有组合和排列,但是 Firefox 仍然缓存页面! 我只需要在用户按下后退按钮时重新加载 URL。 在 IE8 中运行良好。

这些我都试过了……

<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
<meta http-equiv="Expires" content="Sat, 1 Jan 2000 00:00:00 GMT" /> 

...我还尝试了以下 JavaScript...

<input type="hidden" id="refreshed" value="no"/>
<script type="text/javascript">

    onload=function(){
        var e=document.getElementById("refreshed");
        if(e.value=="no"){
            e.value="yes";
        }

        else{
            e.value="no";
            location.reload();
        }

    }

</script> 

...一切都无济于事。我在这里想念什么?如果重要的话,页面是用 PHP 生成的。

更新 1:

到目前为止,我已经尝试了所有建议,但我仍然无法让它发挥作用。当我使用 Chris 的 PHP 代码时,我会这样使用它...

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
<!--the rest of my page-->

.. 如您所见,它位于我网页的 EXTREME 顶部,在 DOCTYPE 标头之前。

我也尝试过session_start(),但即使在阅读了手册之后,我也不确定我是否正确使用它。我也把它放在了页面的最顶部。

我愿意接受任何可以在不破坏其他页面功能的情况下完成这项工作的建议。我知道我看到每次使用后退按钮时页面都会重新加载,他们是怎么做到的?!

已解决!

事实证明,我遇到了多个问题,但通过尽职调查,我能够消除这些问题并取得胜利。

在 Chris 将他的代码更新为...

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
echo time();
?><a href="http://google.com">aaaaaaaaaaaaa</a>

我发现当我完全按照他的方式使用他的代码时,我发现他的代码确实可以工作,但是当我将它放入我的页面时它却没有工作。我所有的页面都是.php.html 并且都附加到一个DWT(动态Web 模板),所以我用Chris 的代码一次更新了它们。我没有意识到 DWT 在 DOCTYPE 标头之后开始,因此代码从未插入到我的页面中。我找不到让 DWT 包含 DOCTYPE 标头的方法,所以我进入所有页面并手动将代码插入到 DOCTYPE 标头上方。

接下来,我发现即使我的服务器设置为将 .htm.html 解析为 .php.html 页面在我插入 Chris 的代码的地方产生了一个错误,说的是“无法修改标头,标头已发送”。我并不真正关心我的扩展是什么,所以我只是将我所有的 .html 扩展更改为 .php 扩展。

最后一个小烦恼是,即使页面现在没有被缓存(就像我想要的那样),当用户使用后退按钮时(即如果用户在当他们导航到页面 b 时,页面 a 的底部,然后用户使用页面 b 上的后退按钮,他们将返回到页面 a 的底部,而不是所需的页面 a 的顶部)。修剪我原来的 JavaScript 修复了这个问题...

    <script type="text/javascript">

        onload=function(){
            document.getElementById('content').scrollTop=0;
        }

    </script>

尽管对于这样一个简单的问题,这似乎涉及很多问题,但我很高兴它已得到解决。感谢大家(尤其是 Chris)的帮助。

【问题讨论】:

  • 不应该是 吗?
  • @Adam 我不这么认为,但我尝试了两种方法以确保......没有运气。

标签: php javascript html firefox back-button


【解决方案1】:

查看实时 http 标头,当您按下返回按钮时,您会看到没有发出任何请求。这是故意完成的,因此您不会丢失您可能在表单中输入的内容。

编辑

专家交流上的一些帖子说这有效,但它是从 2006 年开始的。

<META HTTP-EQUIV="Expires" CONTENT="0">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-store">

然后是 javascript 刷新

【讨论】:

  • 我知道我曾在按下后退按钮并重新加载页面的网站上使用 Firefox。我需要它来帮助白痴为用户证明我的应用程序,所以我不想要求他们安装插件。
【解决方案2】:

这对我有用

创建一个新的 php 文件。我可以使用后退和前进按钮,页面上的数字总是更新

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
echo time();
?><a href="http://google.com">aaaaaaaaaaaaa</a>

【讨论】:

  • @chris 我厌倦了这个的变体(在这里建议:stackoverflow.com/questions/3645609/…)......你的有点不同,所以我也会试试。
  • @chris 有没有可能我把它放错了地方?我已经在&lt;head&gt; 标记中尝试过,就在&lt;html&gt; 标记之后,就在&lt;html&gt; tag, and at the very top of the page, before the DOC TYPE` 之前,但都没有奏效。
  • 您需要将它放在所有内容之前,包括任何空格(空格、换行符等)@typo。
  • @chris 仍然无法工作。有人可以确认这些解决方案中的任何一个都可以在 Firefox 中运行吗?
  • @chris 既然我在这方面遇到了很多麻烦,您介意详细解释一下我如何“正确”使用您发布的代码吗?
【解决方案3】:
<meta http-equiv="Cache-Control" content="no-cache" />

我认为正确的值是“no-cache”

【讨论】:

    【解决方案4】:
    session_cache_limiter('nocache');
    

    这应该会自动生成所有必需的标头。请注意,某些浏览器(例如 Opera)在使用后退按钮时仍然会忽略这些。

    编辑

    相关标头如下,如果您想以其他方式生成它们:

    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    

    【讨论】:

    • 您可以使用 header() 函数发送 http 标头,而不是使用仅在使用会话时才有效的会话相关函数。
    • 这与 chris 发布的内容非常相似,我无法让您的任何建议发挥作用。
    【解决方案5】:

    为什么? 我的意思是,你为什么要这样做? 当我按下后退按钮时,我想要浏览器提供的标准功能——返回上一页。我不想要惊喜。

    如果要阻止意外重新提交 POST,可以通过重定向结束 POST 处理以使用 GET 显示所需回复来轻松完成。稍后返回此页面,将重新显示重定向的 GET(或从必须具有相同结果的缓存中重新加载它)。这是用户所期望的并且是无害的。

    这有一个额外的好处,如果更新数据库时保存失败,显示器将显示数据库中的内容,而不是变量中剩余的内容。

    【讨论】:

    • 这是因为一旦提交了表单,如果用户按下返回按钮,他们正在查看的信息将是不准确的。
    【解决方案6】:

    您发表了评论:

    这是因为一旦表格被 提交,如果用户按下 后退按钮,它们的信息 查看会不准确。

    如果你想阻止这种情况,那你就错了! :)

    您需要做的是在表单提交后进行重定向。

    <?php
        // code that handles the form submit
        header("Location: http://www.example.com/form-success.html"); // needs the absolute url (You can use $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] and dirname() for this)
        exit; // prevents further execution of the php code when while doing to redirect
    ?>
    

    【讨论】:

    • 我已经按照您建议的方式进行重定向,问题是重定向发生后,如果用户按下后退按钮,他们将完全返回上一页,并且它没有被重新加载。我需要重新加载它。
    【解决方案7】:

    您可以在您的 PHP 页面中添加以下 PHP 代码。

    CodeIgniter Framework version:
    $this->output->set_header('Last-Modified:'.gmdate('D, d M Y H:i:s').'GMT');
    $this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate');
    $this->output->set_header('Cache-Control: post-check=0, pre-check=0',false);
    $this->output->set_header('Pragma: no-cache');
    

    PHP版本:

    header('Last-Modified:'.gmdate('D, d M Y H:i:s').'GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: post-check=0, pre-check=0',false);
    header('Pragma: no-cache');
    

    您也可以在&lt;head&gt; 部分的登录/母版页中添加以下 Java 脚本代码:

    <script language="javascript" type="text/javascript">
        window.history.forward();
    </script>
    

    兼容性验证

    • Internet Explorer
    • 谷歌浏览器
    • Mozilla 火狐
    • 歌剧

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2010-12-26
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2018-03-29
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多