在PHP中没有HEADER()的重定向

时间:2013-06-12 18:37:47

标签: php html

我在PHP中有以下代码:

header ("Location: nopass.php?percent=$percentage&type=$type");

表单页面有单选按钮,如果我回去会重置为默认值,因为我正在使用header();更改页面

我认为使用Javascript返回可以解决问题:

<a href="javascript:history.back();">Go Back</a>

但事实并非如此。

header()是否有任何解决方法;重定向而不写标题?

我正在为我的表单使用POST方法。

3 个答案:

答案 0 :(得分:2)

保留表单内容的行为是浏览器提供的便利设施,而不是HTTP 本身

当您使用PHP header()函数进行重定向时,您会使页面返回HTTP状态301302,这会告诉浏览器加载其他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;
    }
}