【问题标题】:Redirect without HEADER() in PHP在 PHP 中没有 HEADER() 的重定向
【发布时间】:2013-06-13 03:00:14
【问题描述】:

我在 PHP 中有以下代码:

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

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

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

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

但它没有。

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

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

【问题讨论】:

  • 使用POST会使之前的请求被丢弃对吧?
  • 我确实创建了一个测试页面来查看它,除非我错了,否则它不会。
  • 示例:interfaithmedical.com/checksite/testFolder/a.htm(我使用 POST 方法)尝试填写所有单选按钮并点击提交,然后在下一页上按“返回”并保持单选按钮状态。
  • @SiKni8:您应该让表单页面记住上一个请求中的选择(会话变量是最简单的方法),然后让header 成为。如果您不这样做,任何类型的重定向都会清除这些值。
  • @Jon 如何在不花费太多时间的情况下完成这项工作。

标签: php html


【解决方案1】:

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

当您使用 PHP header() 函数进行重定向时,您使页面返回一个 HTTP 状态 301302,这会告诉浏览器加载另一个 URL。

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以将表单信息保存在 $_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,识别您的表单以便您不会意外预填充其他表单,并清除有关成功的信息,但这应该给您一个粗略的想法。

    【讨论】:

    • 这听起来不错,但需要更详细的代码... Tll POST 是单选按钮,除了一些文本框,我将使用它们来过滤任何 XSS 攻击.谢谢
    • @SiKni8 请注意,输入字段在 HTML 中显示为单选按钮这一事实防止有人将虚假数据放入该变量中。编写一个提交任意文本的页面(或使用浏览器中的调试工具进行编辑)是非常简单的。
    • @IMSoP 是绝对正确的——您应该始终将任何 GET/POST 变量视为可能不安全,并且应该将它们过滤为文本框,或者使用字符串匹配来拒绝任何意外值.
    • 好点...我会根据你的反馈修改
    • 所以我的PHP页面"q1" =&gt; $_POST['S1Q1'];中的类似内容应该更改为"q1" =&gt; trim(strip_tags(stripslashes($_POST['S1Q1'])));以获得更好的安全性?
    【解决方案3】:

    这将在任何情况下重定向,无论标头是否发送。

    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;
        }
    }
    

    【讨论】:

    • 那么这会使标题保持活动状态吗?
    • 这会让你重定向到特定的 URL。要按照您的要求保留值,您必须使用会话。
    • 所以即使是 UL 重定向也不会让会话保持活动状态?那么这是如何工作的呢? (示例:interfaithmedical.com/checksite/testFolder/a.htm(我使用 POST 方法)尝试填写所有单选按钮并点击提交,然后在下一页上按“返回”并保持单选按钮状态。 )
    • 这与问题无关 - OP 的问题不是重定向失败,而是浏览器在重定向到先前完成的表单时没有记住表单状态。
    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2021-02-16
    相关资源
    最近更新 更多