强制从服务器重新加载页面,而不是加载缓存版本。

12

我有一个名为 A 的网页。用户单击表单提交数据后,将跳转到名为 B 的网页。当用户点击返回按钮时,我需要从服务器刷新页面 A,而不是从缓存加载。我尝试使用以下代码来解决这个问题:<meta http-equiv="expires" content="0"> 但似乎没有起作用。我还尝试在页面B上设置一个变量(通过PHP的会话变量),然后在页面A上检查它是否存在,并根据其存在与否进行刷新(或不刷新)。但这也似乎没有起作用。相关的基本代码如下:

页面 A:

<?php 
if(isset($_SESSION['reloadPage'])) {
unset($_SESSION['reloadPage']);
echo'
<script>
window.location.replace("/****/****/*****.php");
</script>
';
}
?>

并且在页面B上:

$_SESSION['reloadPage'] = 1;

使用PHP解决方案时,页面会无休止地刷新。我的逻辑有什么问题吗?这是正确的方法吗?

编辑 进一步调查发现,当您告诉浏览器不要缓存页面时,是否会强制进行完整的服务器端刷新?那就是我需要的,对页面进行完整的服务器端刷新。


有在线版本我们可以看吗? - Kyle Hudson
6个回答

5

好的,请尝试使用以下方法:

<?php
    if(!session_id()) {
        @session_start();   
    }
    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
    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'); 

    if(isset($_SESSION['form_submitted'])) {
        unset($_SESSION['form_submitted']);
        header('Location: ?' . uniqid());
        #header('Refresh: 0');
    }
?>

在第二页中,您需要设置$_SESSION['form_submitted'] = true。

不像期望的那样工作。但是经过进一步思考,似乎它没有缓存页面... 但从我能看到的情况来看,它在服务器端没有刷新。 - mdance
有在线版本我们可以查看吗? - Kyle Hudson
我会看看能否获取一些公开的东西。 - mdance
搞定了 - 这个方法可行。第一次没成功,因为我忘记了我还在测试其他代码,让我很头疼。一旦我想起来并删除了它,就成功了。感谢您的帮助。 - mdance

2

尝试使用全部三个:

<meta http-equiv="cache-control" content="no-cache"> <!-- tells browser not to cache -->
<meta http-equiv="expires" content="0"> <!-- says that the cache expires 'now' -->
<meta http-equiv="pragma" content="no-cache"> <!-- says not to use cached stuff, if there is any -->

1
<?php 
    session_start();
    if(isset($_SESSION['reloadPage'])) {
        unset($_SESSION['reloadPage']);
           //no outputting code above header
        header("Cache-Control: no-cache, must-revalidate");
        header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
        header("Location: http://www.mypage.com/");
    }
?>

它说重定向太多了...尽管我认为这是迄今为止最好的解决方案。看起来它没有正确地取消reloadPage变量的设置。 - mdance
可能是因为头部已经发送了,如果在头部之前有任何输出代码,比如任何HTML或echo/print,或者其他任何输出到文档的内容,那么就会发生这种情况,头部应该是第一个被发送的东西。这通常会导致“头部已经发送”错误,所以也可能是会话变量没有被取消设置,而且它一直在循环中,尝试稍微调整一下,或者检查变量是否具有某个值,并将其设置为null而不是取消设置等。 - adeneo

1

我知道这是一个旧问题,并且已经有了答案(即不从服务器刷新)。因此,我想分享使用jQuery的解决方案。

$('#back-button').click(function(){
   setTimeout(location.reload(true), 1000);
});

解释:
当您点击返回按钮时,setTimeout将在1秒后(1000毫秒)被触发。然后,页面将从服务器重新加载,因为reload参数内部是true
如果您在reload中放置true,它将从服务器重新加载,而如果您放置false,它将从缓存重新加载。来源w3schools

0

你的 JavaScript 应该是...

window.location = "/****/****/*****.php"

我认为这应该修复你的循环。


0
<?php 
  session_start();
  if(isset($_SESSION['reloadPage'])) {
  unset($_SESSION['reloadPage']);
  echo'
  <script>
  window.location.replace("/****/****/*****.php");
  </script>
  ';
}
?>

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