我在PHP中有以下代码:
header ("Location: nopass.php?percent=$percentage&type=$type");
表单页面有单选按钮,如果我回去会重置为默认值,因为我正在使用header();
更改页面
我认为使用Javascript返回可以解决问题:
<a href="javascript:history.back();">Go Back</a>
但事实并非如此。
header()是否有任何解决方法;重定向而不写标题?
我正在为我的表单使用POST方法。
答案 0 :(得分:2)
保留表单内容的行为是浏览器提供的便利设施,而不是HTTP 本身。
当您使用PHP header()
函数进行重定向时,您会使页面返回HTTP状态301
或302
,这会告诉浏览器加载其他URL。< / p>
与Javascript history.back()
方法的不同之处在于您没有提供URL,而是专门告诉浏览器退回其历史记录,就像用户点击了“返回”按钮一样在工具栏中。然后,浏览器决定表单应该像用户离开该页面时那样呈现。
AFAIK,HTTP中无法告知用户代理回溯其历史记录,因为“历史记录”不是原始HTTP中定义的概念(它是一种明确的无状态协议)。因此,只有客户端代码(即Javascript)才会触发该行为。
不是试图改变重定向的工作方式,为什么不这样做,以便根本不会发生重定向,只需重新显示表单,并预先填充用户的选择。这样您就不会依赖任何特定的浏览器行为。
这不需要任何复杂的会话存储,因为值已经在$_POST
中,因此您只需使用<input name="foo" value="x" <?php if ( $_POST['foo'] == 'x' ) { echo 'selected'; } ?>>
呈现表单元素即可。这是在表单验证后重新显示表单的常用方法。
答案 1 :(得分:1)
您可以将表单信息保存在$ _SESSION中,并在页面上创建表单时检查此信息。一个基本的例子是:
form.php的:
<?php session_start(); //Start the Session ?>
<input type="radio" name="radios" value="value1" <?php
/* Check if we've been submitted before */
if (isset($_SESSION['last_submit']['radios']) && "value1" == $_SESSION['last_submit']['radios']) {
echo "selected";
}
?> > Value 1 </input> "
/.. more inputs ../
并在submit.php中
<?php
session_start();
$_SESSION[last_submit] = (!empty($_POST)) ? $_POST : array();
显然,您希望过滤任何XSS的POST,识别您的表单,以便您不会意外地预填充其他表单,并清除成功信息,但这应该给您一个粗略的想法。
答案 2 :(得分:1)
无论如何都会重定向,无论是否发送标题。
function redirect($url)
{
if (!headers_sent())
{
header('Location: '.$url);
exit;
}
else
{
echo '<script type="text/javascript">';
echo 'window.location.href="'.$url.'";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
echo '</noscript>'; exit;
}
}