后退按钮重新提交表单数据($_POST)

19

我的问题是,当以表单形式提交请求的页面返回到上一页时,浏览器会显示“页面已过期”的提示信息。

例如:

  • 第一页:使用搜索条件提交表单(使用$_POST请求),跳转到第二页
  • 第二页:接收$_POST请求并显示结果(包含用户链接的列表),跳转到第三页
  • 第三页:显示用户个人资料

现在,当访问者在浏览器中点击“后退”按钮时,它将显示类似于“页面已过期”的内容。

相反,应该显示前一页而无需警告(即带有用户列表的第二页)。

你有什么解决这个问题的策略吗?


2
哇!我刚学到了新东西:not 标签操作符。xD - Alix Axel
6个回答

23
如果你在提交包含搜索参数的表单,那么你是在尝试获取一些数据,而不是修改已有数据。

所以,你应该使用HTTP GET方法,而不是POST:POST应该用于创建或修改数据,GET应该用于获取某些数据。

或者,如果你有一些需要创建或修改数据的操作:

  • 表单首先通过POST提交到第一个页面
    • 该页面执行一些操作(比如向数据库写入一些内容)
    • 然后使用Location HTTP头重定向到另一个页面。
  • 最后,浏览器使用GET请求查询该页面,显示从URL接收的参数获取的数据。

关于此,请参见维基百科上的Post/Redirect/Get页面。


1
非常好的回答。非常清晰明了,直截了当。还提供了比要求更多的选择和更深入的见解。谢谢。 - Cudos
但是当我发送GET请求时,URL不够用户友好,并且包含所有搜索数据。我该如何解决这个问题? - Dmytro Zarezenko
另外一个问题,如果您不介意的话。我使用POST方法,因为我的页面必须搜索一些UTF-8字符(在我的情况下是“韩语”)。使用GET无法传递正确的搜索文本。然而,由于我使用了POST方法,浏览器的后退按钮无法正常工作。在这种情况下我该怎么办?谢谢:D - Juneyoung Oh
如果一些变量留空,获取变量以制作干净的SEO URL将会出现问题。 - user7796548


2

这适用于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");

1

在您发出的脚本中,发送一个指向接下来页面的Location头。


使用HTTP状态码303来实现。根据当前文档,如果未明确指定,则PHP默认为302。 - MattBianco

1
不要使用POST进行搜索。使用GET可以安全地进行搜索,因为它不会改变任何内容。

0
你可以使用session来完成这个操作。
例如: $_SESSION['name'] = $_POST['name'];
记得在进程完成后取消设置你的变量,以优化内存使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接