【问题标题】:PHP "Document Expired" after using the back button使用后退按钮后 PHP“文档已过期”
【发布时间】:2012-07-11 06:54:53
【问题描述】:

我有一个表格,我在向导中填写一些信息。此页面通过 POST 到达并使用 Smarty 显示。一旦我提交了所有信息,我将使用另一个帖子进入另一个页面。现在,问题是当我尝试使用 BACK 按钮返回时,我收到“文档已过期”消息。

当我使用 POST 时,这不是正常的事情吗?

我现在正在尝试使用 GET,但没有任何改变,或者我的 GET 写错了。

这是一个小架构:

Page 1 -> POST -> Page 2 (wizard) -> POST -> Page 3

当我尝试从第 3 页返回到第 2 页时,文档已过期。

非常感谢您对我的问题的帮助。

【问题讨论】:

  • 这对于 POST 来说是正常的。 POST 是为了改变服务器的状态,这意味着你正在查看的页面可能已经过期,或者它的会话已经过期。
  • 谢谢 2Truth,我应该使用 GET 而不是 POST 对吗?
  • GET 应该用来读取服务器状态,永远不要改变它。 (从数据库中读取数据,获取信息)。如果您要更改服务器上的某些内容,请使用 POST,而不是 GET。 Page Expired 页面没什么好怕的,也不是你应该努力摆脱的东西。
  • 我同意。 GET 是你要走的路,但它不安全,也不意味着这个(或者如果它只是几个值,你也可以把它放在一个 SESSION 中,只要你在它们出现在第 3 页时删除它们 - 虽然这很糟糕练习 - 但它有效)
  • 感谢您的@Truth 和 PoeHaH。其实在第1页和第2页中,服务器上没有任何变化,我只是在阅读,我也可以使用GET。所以,如果我将 GET 用于第 2 页,一旦我转到第 3 页,我将返回第 2 页,而没有文档过期消息

标签: php post smarty


【解决方案1】:

http://en.wikipedia.org/wiki/Post/Redirect/Get

在我看来,您应该为每个 POST 执行此操作,至少在生产中是这样。

小例子:

if ('GET' == $_SERVER['REQUEST_METHOD']) {
   //display view
}
else if ('POST' == $_SERVER['REQUEST_METHOD']) {
   //process input
   //update session
   header('Location: /next/page/to/view', true, 303);
}

编辑:想指出这篇旧帖子指的是浏览器提交。在 RESTful Web 服务中,您可能会使用 201 来响应 POST。

【讨论】:

  • 谢谢@Explosion Pills,这种模式似乎正是我所需要的。你有一个如何使用它的例子吗?
  • 不是这样......有很多不同的方法可以做到这一点,这取决于你的情况。关键是,如果您知道用户使用了POST(检查REQUEST_METHOD,检查_POST 值是否已设置——等等)进行所有处理,然后重定向。否则,发射视图。
  • 再次感谢您。所以,我必须使用会话。但正如我所见,会话有一个名为 $_SESSION 的超级全局变量。我还应该保存这个数组中的所有信息吗?
  • @Ana 完全正确;这就是会议的目的。你也可能有一些处理会话的包装器,或者你可以使用_SESSION
  • 非常感谢,我会尝试使用这个的。
【解决方案2】:

一切都是正确的。当您在 Page 3 上推送 BACK 时,您实际上是在尝试转到上一页 - 此页面是作为对 bowser 的 POST 请求的回复而生成的。要查看此页面,应发送新的 POST 请求,并根据 POST 数据生成页面。

【讨论】:

  • 谢谢网络强盗。好的,我明白了。对于第 2 页,我还应该使用 GET 而不是 POST 吗?
  • 使用GET 请求可以解决这个问题。 GET 请求中的所有 posting 数据都是通过 URL 发送的,因此在浏览器中使用 BACK 意味着只有 go to <URL> again
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2013-04-26
  • 2014-11-28
  • 2015-12-20
相关资源
最近更新 更多