提交表单上的浏览器缓存问题

时间:2016-05-26 19:18:46

标签: php nginx http-headers symfony-1.4 browser-cache

我不相信这是一个框架问题。在我的研究中,它似乎是一个浏览器缓存问题,但我尝试过的东西却没有用。

不幸的是,即使我不希望用户点击后退按钮,但显然没有办法(真的)阻止用户点击后退按钮。

这是表格上传的结果。

enter image description here

这很好我得到了预期的结果。

当用户点击后退按钮时,他们会获得原始形式,而不是他们刚刚上传的图片。

enter image description here 用户在单击提交表单中的后退按钮后单击刷新后,将获得应显示的上载图像。

enter image description here

我有两个模板layout.php和layout_wide.php

我在两个模板中都试过这个。

    <meta http-equiv="cache-control" content="max-age=0" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="expires" content="0" />
    <meta http-equiv="pragma" content="no-cache" />

我试过这个自定义助手......

<?php
function include_stylesheets_versioned()
{
    $response = sfContext::getInstance()->getResponse();
    sfConfig::set('symfony.asset.stylesheets_included', true);
    $html = '';
    foreach ($response->getStylesheets() as $file => $options) {
        if ((strpos($file, '?') === false) && (stripos($file, 'http') !== 0) ) {
            $file .= '?v='.sfConfig::get('app_resource_version');
        }
    $html .= stylesheet_tag($file, $options);
    }
    echo $html;
}
function include_javascripts_versioned()
{
    $response = sfContext::getInstance()->getResponse();
    sfConfig::set('symfony.asset.javascripts_included', true);
    $html = '';
    foreach ($response->getJavascripts() as $file => $options) {
        if ((strpos($file, '?') === false) && (stripos($file, 'http') !== 0) ) {
            $file .= '?v='.sfConfig::get('app_resource_version');
        }

    $html .= javascript_include_tag($file, $options);
    }

    echo $html;
}

我准备尝试将其放在模式或iframe中,以便为此表单提取后退按钮问题。但是我有另一种类似问题的形式,即放入模态并不是一种选择。

昨天我确实看到了Post Redirect获取设计模式并认为它可能是一个解决方案,但我想知道为什么meta标签根本不起作用。

我意识到这可能是一个重复的问题,但我无法找到有效的解决方案。

是否还有其他人遇到此问题,有人请指点我解决。

该应用程序位于AWS实例上,如果与此有任何关联,则服务器为NGINX。

提前谢谢你。

2 个答案:

答案 0 :(得分:0)

请仔细检查your browser cache is clean,然后按article

您需要为CONTENT="-1"设置HTTP-EQUIV="Expires"而不是0

您还需要根据此answer

使用<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache, no-store, must-revalidate"/>
<HTML>
<HEAD>
<TITLE>---</TITLE>
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, no-store, must-revalidate">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
</HEAD>
<BODY>

Text in the Browser Window

</BODY>
<HEAD>
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, no-store, must-revalidate">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
</HEAD>
</HTML>

但是HTTP-EQUIV is highly unreliable所以你需要发送HTTP header from NGINX所以首先创建一个配置文件,并将其命名为expires.conf,然后将其包含在你的原始nginx confing中:

server {
    listen ...;
    root ...;
    index ...;

    server_name ...;

    charset ...;
    include expires.conf; #here

    ...
}
你的expires.conf中的

表示你不想缓存静态文件(或者你不想要的任何东西):

location ~* \.(?:manifest|appcache|html?|xml|json)$ {
  expires -1;
}

注意:

  • 注意单词的情况。例如P ragma
  • 在html结构底部使用HEADMETA标记是IE缓存策略的解决方法。

答案 1 :(得分:0)

我需要重做我的布局模板以遵循新标准。它们是很久以前创作的。

这样可以在后退按钮上给我一个新的时间结果。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 <?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");
 ?>

<?php include_javascripts() ?>
<?php include_stylesheets() ?>
<?php include_http_metas() ?>
<?php include_metas() ?>
<?php include_title() ?>
<link rel="shortcut icon" href="/favicon.ico" />
</head>
<body>
 <?php echo $sf_content ?>
</body>
</html>
<?php echo time(); ?>

我认为最大的变化是DOCTYPE

OLD DOC TYPE

<!DOCTYPE html>

请注意**** !!!!

以上都不适用于symfony 1.4.20

对于那些仍在使用1.4的人来说,我必须将以下内容放入操作中才能使其正常工作。

    $this->getResponse()->setHttpHeader('Cache-Control', 'no-cache, no-store, must-revalidate, max-age=0, private'); 
    $this->getResponse()->setHttpHeader('Pragma', 'private'); 
    $this->getResponse()->setHttpHeader('Expires', 0);