用于复制nocache = 1功能的PHP代码

时间:2015-09-01 21:09:54

标签: php

原谅我之前解释问题的努力。这是我在这里的第一篇文章,我需要一些练习来缩小真正的问题。我已经删除了一些PHP代码来演示这个问题:

<?php
session_start();
$message = "";
if($_SERVER['REQUEST_METHOD'] === 'POST') {
    if(empty($_SESSION['token1'])) {
        $message = "After post SESSION(token1) is not present<br/><br/>";
    } else {
        $message = "After post SESSION(token1) is present<br/><br/>";
    }
}
$_SESSION['token1'] = "abcxyz";
?>
<html>
    <body>
        <?php 
        echo $message; 
        ?>
        <form action="" name="frmLogin" id="frmLogin" method="POST" accept-charset="utf-8">
            <input type="submit" name="cmdSubmit" value="Submit" />
        </form>
    </body>
</html>

场景1:当我浏览包含此代码的页面时,会出现Submit按钮。当我单击该按钮时,它会显示“After Post SESSION(token1)不存在”(再次显示Submit按钮)。当我再次单击该按钮时,它会显示“After post SESSION(token1)”。

场景2:当我通过附加“?nocache = 1”浏览到包含此代码的页面时,在第一次点击后显示“After post SESSION(token1)”。

场景3:当我在本地电脑上的本地主机上浏览此页面时(即使没有“?nocache = 1”),在第一次点击后显示“发布后SESSION(令牌1)”。

一个肯定有帮助的观察:在页面初始加载后的场景1中,我检查了该域的浏览器cookie,并看到没有PHPSESSID cookie存在。点击Submit一次后,cookie就在那里。对于方案2和3,PHPSESSID cookie在第一页加载后(在单击Submit之前)存在。在每种情况下,我都会在浏览页面之前清除域名的cookie。

如您所见,会话已启动,并且会话var已设置。那么为什么在第一次回发后才被认出来呢?而且,更重要的是,我如何对其进行编码,以便在每个环境中加载第一页后识别它?

我的第一个想法是,因为在URL中添加“?nocache = 1”使其在所有环境中都能正常工作,如果我能以某种方式编写PHP来复制那些可以解决它的行为。但我愿意接受建议。

1 个答案:

答案 0 :(得分:0)

?nocache=1本身没有行为 。您认为?nocache=1有行为的原因是浏览器分别缓存index.phpindex.php?someparam=someval。它与确切的短语?nocache=1无关。它被处理就像任何参数一样。它也没有阻止缓存的发生。第二次拨打index.php?nocache=1时,您将访问缓存版本,但它将是index.php?nocache=1的缓存而不仅仅是index.php

  

我已尝试使用元标记(pragma,cache-control,expires)

的所有建议

大多数浏览器都会忽略使用元标记进行缓存控制。您需要做的是在PHP中使用header()来设置缓存控制头:

<?php
session_start();
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0',true); 

在打印任何内容之前,应在页面顶部完成。