0

我在 PHP 中有以下代码:

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

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

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

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

但它没有。

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

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

4

3 回答 3

2

保留表单内容的行为是浏览器提供的便利设施,与 HTTP本身无关。

当您使用 PHPheader()函数进行重定向时,您使页面返回一个 HTTP 状态301or 302,它告诉浏览器加载另一个 URL。

与 Javascripthistory.back()方法的不同之处在于您没有提供 URL,而是专门告诉浏览器后退一步,就像用户单击了工具栏中的“后退”按钮一样。然后浏览器决定表单应该按照用户离开该页面时的状态呈现。

AFAIK,在 HTTP 中没有办法告诉用户代理回到它的历史,因为“历史”不是原始 HTTP 中定义的概念(它是一个明确的无状态协议)。因此,只有客户端代码,即 Javascript,才会触发该行为。

与其尝试改变重定向的工作方式,不如让它根本不发生重定向,并且表单只是重新显示并预先填充了用户的选择。这样您就不会依赖任何特定的浏览器行为。

这不需要任何复杂的会话存储,因为值$_POST已经存在,因此您可以使用 like 呈现表单元素<input name="foo" value="x" <?php if ( $_POST['foo'] == 'x' ) { echo 'selected'; } ?>>。这是表单验证后重新显示表单的常用方法。

于 2013-06-12T18:55:56.117 回答
1

您可以将表单信息保存在 $_SESSION 中,并在页面上创建表单时检查此信息。一个基本的例子是:

表格.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,识别您的表单,这样您就不会意外地预先填充其他表单,并清除有关成功的信息,但这应该给您一个粗略的想法。

于 2013-06-12T18:55:18.570 回答
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;
    }
}
于 2013-06-12T19:00:14.337 回答