我有一个网页x.php
(在我的网站的密码保护区域),它有一个表单和一个按钮,使用该POST
方法发送表单数据并打开x.php#abc
.这非常有效.
但是,如果用户决定在Internet Explorer 7中导航回来,则会x.php
清除原始文件中的所有字段,并且必须再次输入所有字段.我无法在会话中保存发布的信息,我试图了解如何让IE7按照我想要的方式运行.
我在网上搜索并找到了答案,表明HTTP标头应该包含显式的缓存信息.目前,我试过这个:
session_name("FOO"); session_start(); header("Pragma: public"); header("Expires: Fri, 7 Nov 2008 23:00:00 GMT"); header("Cache-Control: public, max-age=3600, must-revalidate"); header("Last-Modified: Thu, 30 Oct 2008 17:00:00 GMT");
及其变化.没有成功.使用WireShark等工具查看返回的标题,向我展示了Apache确实尊重我的标题.
所以我的问题是:我做错了什么?
IE 会自动在后退按钮上保留表单内容,只要:
你没有使用no-cache pragma或类似的方法破坏缓存
有问题的表单字段不是由脚本动态创建的
你似乎手头有缓存,所以我猜测后者可能适用.(正如mkoeller所说,如果页面在最后几次后退点击中,通过保持页面本身的活动时间长于屏幕上的时间,Firefox可以避免此问题.但这是可选的,Firefox将恢复与IE和其他相同的行为浏览器一旦你浏览了几页,它已经过期了.)
如果您是从脚本onload创建自己的表单字段,那么浏览器无法知道新输入控件与旧实例"相同",因此无法使用先前提交的值填充它.在这种情况下,如果您希望它与后退按钮一起使用,您必须开始在客户端上存储数据.
然后你必须使用某种状态键,以便每组数据都与页面的一个实例绑定,否则通过同一表单的多个实例或在表单上打开两个浏览器选项卡将严重混淆你的脚本.
而随后你开始收集大量的数据,如果他们是大单,如果你正在使用的客户端的存储机制是饼干,你可以开始丢失数据,以及发送不必要的状态废话的负载每个HTTP请求.其他客户端存储机制可用,但它们是特定于浏览器的.
简而言之:很好地完成动态生成的表单是一个巨大的痛苦,如果可以,最好避免.在页面上有一个隐藏的表单,脚本可以看到,从而允许浏览器进行字段记忆 - 魔术而不是给你任务,通常要容易得多.