后退按钮重新提交表单数据 ($_POST)
Posted
技术标签:
【中文标题】后退按钮重新提交表单数据 ($_POST)【英文标题】:Back button re-submit form data ($_POST) 【发布时间】:2011-01-09 22:13:26 【问题描述】:我的问题是,当前一页由表单创建时,后退按钮会导致浏览器显示“页面已过期”之类的信息。
例子:
page1:通过搜索提交的表单 条件($_POST 请求,表单 指向第 2 页) page2:接收 $_POST 请求并 显示结果(带有链接的用户列表, 指向页面3) page3:显示用户资料现在,当访问者点击浏览器中的后退按钮时,它会显示类似“页面已过期”的信息。
应该显示上一页而不显示任何警告(第 2 页,带有用户列表)
您有哪些策略来规避这种行为?
【问题讨论】:
哇!我刚刚学到了一些新东西:not
标签运算符。 xD
【参考方案1】:
在您发布到的脚本中发送一个Location
标头,指向后面的页面。
【讨论】:
为此使用 HTTP 状态码 303。如果没有根据当前文档明确指定,php 默认为 302。【参考方案2】:使用Post/Redirect/Get (PRG) Pattern。
【讨论】:
【参考方案3】:如果您提交带有搜索参数的表单,您是在尝试获取一些数据,而不是修改一些数据。
因此,您应该使用 HTTP GET 方法,而不是 POST:当您打算创建/修改数据时应该使用 POST,而当您打算获取一些数据时应该使用 GET。
或者,如果您有一些必须完成的创建/修改操作:
表单首先发布到第一页 该页面执行一些操作(例如向数据库写入内容) 然后使用Location
HTTP 标头重定向到另一个页面。
最后一页,即浏览器使用 GET 请求进行的查询,显示从 URL 中接收的参数获取的数据。
请参阅***上的 Post/Redirect/Get 页面,了解此内容。
【讨论】:
优秀的答案。再清楚不过了。也给予超过要求;替代方案和更多洞察力。谢谢。 但是当我发送 GET 请求 URL 时用户不友好,并且包含所有搜索数据。我该如何解决这个问题? 另外一个问题,如果您不介意的话。我使用 POST 方法,因为我的页面必须使用一些 UTF-8 字符进行搜索(在我的例子中,'韩语')。它无法使用 GET 提供正确的搜索文本。但是,由于我使用了 POST 方法,所以 Bowser 后退按钮不起作用。在这种情况下我能做什么?谢谢:D b 在为 seo 制作干净的 url 时获取变量会出现问题。如果某些变量留空...【参考方案4】:不要使用 POST 进行搜索。可以使用 GET 安全地完成搜索,因为它不会改变任何内容。
【讨论】:
【参考方案5】:这适用于 PHP 和 IE8。
您不仅必须将缓存设置为私有,还必须删除 4 个缓存标头,而这只能在 PHP 5.3 中完成。在 PHP 5.2 中,如果使用 Zend Framework 的 setHeader() 方法,您只能将 4 个标头设置为空白值。由于某种原因,在 IE8 上将 4 个标头值设置为空值是不够的。这是 PHP 5.3 的代码:
header_remove("Expires");
header_remove("Cache-Control");
header_remove("Pragma");
header_remove("Last-Modified");
【讨论】:
【参考方案6】:您可以使用会话来执行此操作。
例如。
$_SESSION['name'] = $_POST['name'];
请记住在该过程完成后取消设置变量以优化内存使用。
【讨论】:
以上是关于后退按钮重新提交表单数据 ($_POST)的主要内容,如果未能解决你的问题,请参考以下文章