我正在寻找一个解决方案来解决我在我的应用程序中使用基于表单的搜索结果的反复出现的问题。
基本上,当用户使用HTML表单进行搜索并在下一页显示数据库的结果时,这非常有效。
但是,当用户点击结果集中的单个记录然后点击浏览器上的“返回”时,浏览器会询问(Firefox):
“要显示此页面,Firefox必须 发送重复任何信息 动作(例如搜索或订单 确认)已执行 早期的“。
举一个例子,一个用于搜索DVD集合的表单,用户按年份搜索,点击单个电影。当用户点击回搜索结果页面时,我不希望用户必须重新提交/重新发送该表单数据。
那么有人知道如何解决这个问题吗?
为了提供更多信息,我使用POST方法提交表单,并使用以下标题阻止浏览器缓存页面。
Header('Pragma: no-cache');
Header("Cache-control: private, no-cache, no-store");
Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");.
由于大部分网站都受密码保护,我不希望密码保护端缓存,并且能够在登录后重新启动。
基本上,避免此类浏览器行为的最佳方法是什么?原因是什么?无缓存是罪魁祸首吗?我应该在搜索结果页面的页面加载中指定将来几分钟的过期时间吗?
接近此问题的最佳方法是什么,因为我在其他网站上没有看到此问题。我对无缓存部分的看法都错了吗?
答案 0 :(得分:5)
您的浏览器正在执行此操作,因为当用户点击“返回”时,浏览器需要再次发布数据才能重新加载页面。解决此问题的一种方法是使用GET请求而不是POST。在GET请求中,表单数据在实际URL中包含/编码。
作为旁注 - 无论是使用GET还是POST,您都应该考虑是否需要使用会话来缓存结果,以防止不必要的数据库调用。
P.S。使用GET请求的优势在于您的搜索结果页面可以加入书签。
编辑:表格上有一些很好的信息,POST / GET请求以及它们之间的差异here,包括解决此问题的“发布后重定向”模式的信息。
答案 1 :(得分:0)
对于搜索信息,您可以使用GET而不是POST。这会将表单数据保留在URL中。导致您的问题是因为当用户单击时需要重新提交POST数据。
答案 2 :(得分:0)
有两种方法可以防止这种行为。
302 Redirect
报头中。答案 3 :(得分:0)
这与PHP无关。
如果您使用后退按钮返回执行POST的任何页面 将要求再次执行该POST。
GET没有发生的原因是GET信息是 在URL中。