簡體   English   中英

在PHP中不使用HEADER()進行重定向

[英]Redirect without HEADER() in PHP

我在PHP中有以下代碼:

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

表單頁面上有單選按鈕,如果我返回,則將重置為默認值,因為我正在使用header();更改頁面header();

我以為使用Javascript可以解決此問題:

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

但事實並非如此。

header()是否有任何解決方法? 重定向而不寫標題?

我正在為表單使用POST方法。

. 保留表單內容的行為是瀏覽器提供的一種便利功能,與HTTP 無關。

當您使用PHP header()函數重定向時,您使頁面返回HTTP狀態301302 ,從而告訴瀏覽器加載其他URL。

與Javascript history.back()方法的不同之處在於,您沒有提供URL,而是專門告訴瀏覽器退回其歷史記錄,就像用戶單擊了工具欄中的“后退”按鈕一樣。 。 然后,瀏覽器決定應該以用戶離開該頁面時的形式呈現表單。

AFAIK,HTTP中沒有辦法告訴用戶代理返回其歷史記錄,因為“歷史記錄”不是原始HTTP中定義的概念(它是一個明確的無狀態協議)。 因此,只有客戶端代碼(即Javascript)才能觸發該行為。

與其嘗試更改重定向的工作方式,不如不做使其根本沒有重定向發生,而是簡單地重新顯示表單並預先填充用戶的選擇。 這樣,您就不會依賴任何特定的瀏覽器行為。

這不需要任何復雜的會話存儲,因為這些值已經在$_POST ,因此您可以使用<input name="foo" value="x" <?php if ( $_POST['foo'] == 'x' ) { echo 'selected'; } ?>> <input name="foo" value="x" <?php if ( $_POST['foo'] == 'x' ) { echo 'selected'; } ?>> 這是在表單驗證后重新顯示表單的常用方法。

您可以將表單信息保存在$ _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,識別您的表單,以免意外地預填充其他表單,並清除成功信息,但這應該給您一個大概的想法。

無論是否發送標題,這都將重定向。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM