【发布时间】:2013-06-25 08:18:21
【问题描述】:
注意:这不是缓存问题,也不是服务器配置错误,也不是浏览器问题。经过仔细调查,我发现问题是由于我的代码中的问题造成的: 很愚蠢,填充字段的选择查询在我的更新查询之前,导致表单始终显示更新之前的值。重新加载后,当然会出现新更新的值,导致我看错了方向。
然而,这个问题很好地概述了面临缓存问题时所有可能的解决方案。
我正在构建一个应用程序,其中包含由数据库中的值填充的表单。 用户可以更改表单的输入值。提交后(不是通过 AJAX),新值被保存到数据库并再次显示相同的表单,这次包含新值,直接从数据库加载。但是:我的浏览器(Windows 7 上的 Chrome v27.0.1453.116m)缓存了旧值。仅当我再次导航到我的页面时才会显示新值。
<form id="edit_form" class="form" action="http://the.same.url/" method="post">
<input type="text" name="example" value="<?php echo $value_from_database; ?>" />
</form>
我遇到了几种解决方案,但都没有完全解决问题:
- 在表单标签上设置属性
autocomplete="off":这似乎没有效果。 - 在单个输入标签上设置属性
autocomplete="off":即使与上述解决方案结合使用,这也不会产生结果 - 在页面加载时使用 JavaScript 重置表单:这会产生一些结果,但显然不会影响单选按钮和其他按钮。
- 防止通过元标记缓存页面,如下所示:Using <meta> tags to turn off caching in all browsers? 此外,通过 .htaccess 或 php 标头防止缓存无效。
- 按照 Miro Markarian 以下评论的建议,尝试通过向操作 URL 添加随机数来破坏缓存
以下是建议解决方案的概述:Make page to tell browser not to cache/preserve input values
我有哪些选择?如果可能的话,我想避免异步发布我的表单。它开始看起来好像我别无选择。任何意见表示赞赏。
请注意,此行为也会出现在其他浏览器中,例如 IE10。
我的页面标题与表单中一个输入的值相同,并且在提交新值时也不会更改,恕我直言,我们可以确定这是一个缓存问题。
Google Chromes 的 Web Developer 插件显示以下标题:
Pragma: no-cache
Date: Sun, 30 Jun 2013 09:44:12 GMT
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Apache
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
Expires: Thu, 19 Nov 1981 08:52:00 GMT
200 OK
【问题讨论】:
-
一种可能的解决方案是返回 url,并在 url 的末尾附加一个随机值......就像
?nocache=875138可以通过 php 中的rand()函数实现..跨度> -
谢谢,我会马上调查的。
-
您确定是浏览器而不是服务器在缓存页面吗?您的应用程序是否发送
not-modified标头? -
这很奇怪。我的观点是,如果一个表单位于example.com/myform.php 并且您提交给example.com/myform.php?rnd=23215234,那么应该没有浏览器缓存该页面。我认为你在某处有一个错误配置的服务器。
-
将以下代码添加到您的 php 文件中:
<!-- This page was generated on <?= date( 'D, d M Y H:i:s' ) ?> -->并在提交前后检查页面。如果这条注释发生了变化,那么它就是 -no- 缓存问题,而是你的代码本身的问题。
标签: php jquery html forms apache