* 更新 *
这是我的解决方案。
我知道,使用 post-redirect-get 后,POST 通常会返回到同一页面进行处理,然后再通过 GET 将表单从表单重定向到另一个目的地。但是,我需要能够返回到原始页面进行重新编辑(如在用户可以保存正在进行的工作的文档模型中)。因此,将 POST 到第二页并重定向回原始页面是我摆脱“EXPIRED”消息的想法,因为编辑表单不会有与之关联的发布数据。我已经扩展了这个(未显示)以包括 $_FILE 和其他情况(例如也使用它a href
)。不知道为什么投反对票。这几个月来一直运行良好并完成了任务。我不再收到“文档已过期”消息。此外,
测试表格.php
<?php
session_start();
if (isset($_GET) && count($_GET)>0){
// process get
var_dump($_GET);
}
if (isset($_SESSION['post-copy'])){
// return post vars to $_POST variable so can process as normal
$_POST = $_SESSION['post-copy'];
// unset the session var - with refresh can't double process
unset($_SESSION['post-copy']);
// process post vars
var_dump($_POST);
}
?>
<form method='post' action='__b.php?redirect=<?php echo $_SERVER['PHP_SELF'] ?>&help=me' enctype='multipart/form-data'>
<textarea name='descr' id='descr'>ABCD</textarea>
<input type='submit' value='Go'>
</form>
重定向.php
<?php
if (!isset($_SESSION)){
session_start();
}
if (isset($_POST)){
$_SESSION['post-copy'] = $_POST;
}
// retrieve the url to return to
if (isset($_GET['redirect'])){
$url = $_GET['redirect'];
}
// if multiple query string parameters passed in get, isolate the redirect so can build querystring with the rest
if (isset($_GET) && count($_GET) > 1){
$get = $_GET;
foreach ($get as $key => $val){
if ($key == 'redirect'){
// remove from rest of passed get query string
unset($get[$key]);
}
}
if (count($get) > 0){
$url .= (strpos($url,"?")===false ? "?" : "&") . http_build_query($get);
}
}
if ($url!==""){
header("Location: " . $url);
}
?>