簡體   English   中英

PHP標頭位置重定向不起作用

[英]Php header location redirect not working

不知道為什么這不起作用。 這是代碼:

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    echo $_POST['cancel'];
}

代替重定向頁面,此輸出cancel到網頁。 它跳過了重定向。 為什么? 我怎樣才能解決這個問題? page1.php是一個實際頁面,與當前頁面位於同一文件夾中。 上面的代碼是php文件的第一行。 沒什么 沒有。 甚至沒有空格。

這可能是由已發送的標頭產生的問題。

為什么

如果您在決定重定向之前回顯了任何內容,就會發生這種情況。 如果是這樣,則已發送初始(默認)標頭,並且新標頭無法替換輸出緩沖區中已經准備好發送到瀏覽器的內容。

有時甚至沒有必要自己回聲:

  • 如果正在向瀏覽器輸出錯誤,則它也被視為內容,因此必須在錯誤信息之前發送標頭;
  • 如果您的一個文件以一種格式編碼(例如ISO-8859-1),而另一種文件以另一種格式編碼(例如具有BOM的UTF-8),則兩種編碼之間的不兼容性可能會導致輸出幾個字符;

讓我們檢查

要測試是否是這種情況,您必須啟用錯誤報告: error_reporting(E_ALL); 並設置要顯示的錯誤ini_set('display_errors', TRUE); 之后,您可能會看到一條警告,指出已發送的標頭。

修復

解決此類錯誤:

  • 在輸出任何內容之前,將重定向邏輯寫在代碼中的某處;
  • 使用輸出緩沖區捕獲任何傳出信息,並僅在您知道所有重定向嘗試均已運行時才釋放它;
  • 使用適當的MVC框架,他們已經解決了該問題;

更多

MVC通過確保邏輯在控制器中並且控制器僅在控制器的末端觸發視圖的顯示/渲染來在功能上解決這兩個問題。 這意味着您可以決定在操作內某處進行重定向,但不能隨視圖一起進行。

我以前曾經遇到過這種問題,現在我沒有使用header('Location: pageExample.php'); 不再,而是使用javascript的document.location

改變你的:

header('Location: page1.php');

對於這樣的事情:

echo "<script type='text/javascript'> document.location = 'page1.php'; </script>";

echo $_POST['cancel'];的目的是什么echo $_POST['cancel']; 順便說一句?如果需要的只是重定向,只需刪除該行。 我一直在使用那個<script> ,它並沒有讓我失望。 :-)

使用@obstart或嘗試使用Java Script

把你的obstart(); 進入頁面頂部

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

如果您使用Javascript請使用window.location.href

window.location.href示例:

 if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
    {
        echo "<script type='text/javascript'>window.location.href = 'page1.php';</script>"
        exit();
    }

我在高迪托管中也遇到了類似的問題。 但是在放置ob_start()之后; 在從頁面重定向到的php頁面的開始處,它工作正常。

請找到修復示例:

文件名: index.php

<?php
ob_start();
...
header('Location: page1.php');
...
ob_end_flush();
?>

對我來說,它也不起作用。 然后我嘗試在php之內使用javascript

echo "<script type='text/javascript'>  window.location='index.php'; </script>";

這肯定會工作。

我有類似的問題...通過添加ob_start();來解決ob_start(); ob_end_flush(); ...

<?php 
ob_start();


require 'engine/vishnuHTML.class.php';
require 'engine/admin/login.class.php';

$html=new vishnuHTML();
 (!isset($_SESSION))?session_start():"";

/* blah bla Code
...........
...........
 */

</div>
</div>
<?php
}



ob_end_flush();
?>

可以將ob_start()看作是“開始記住通常會輸出的所有內容,但還沒有做任何事情。”

ob_end_clean()或ob_flush(),它們要么停止保存內容並丟棄已保存的內容,要么停止保存並立即輸出所有內容。

Pekka在評論中回答了我的問題。 他沒有發布答案,所以我現在是。 標頭重定向后,請使用exit()方法。 由於某種原因,頁眉的其余代碼在header()方法重定向后仍繼續執行。 當其余代碼執行完后,echo語句將輸出到頁面。 輸出到頁面后,您將無法使用標題功能進行重定向。 為了避免執行其余代碼,請使用exit() 謝謝Pekka。

更新:使用Web瀏覽器Internet Explorer時,我注意到$ _POST ['cancel']不可靠。 我不確定為什么會這樣,但是我懷疑IE在表單提交中發布了其他變量,特別是變量“取消”已發布。 我通過使用'cancel'以外的變量名解決了這個問題。 使用exit()和唯一變量名的組合對我來說很有效。

嘗試添加

ob_start();

在代碼的頂部,即在include語句之前。

Neer在這里指定退出代碼,因此php不再執行

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');        
    exit(0); // require to exit here 
}

確保在頁面頂部啟動<?php標記時,在<?php之前不要留空格。

對空格和可能影響已完成的“輸出”的其他內容要非常小心。 我當然知道這一點,但仍然遇到同樣的問題。 我的整個“ Admin.php”文件在關閉php-tag之后有一些空格?>在最后一行的底部:)

通過添加...輕松發現...

error_reporting(E_ALL);

...告訴我哪一行代碼生成了輸出。

嘗試此操作,在頁面頂部添加@ob_start()函數,

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

使用以下代碼:

if(isset($_SERVER['HTTPS']) == 'on')
{

    $self = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    ?>

     <script type='text/javascript'>
     window.location.href = 'http://<?php echo $self ?>';
     </script>"
     <?php

     exit();
}
?>

將<?php標記放在文件頂部(從文檔的第一行開始)

不:

--- Blank space or something ---
<?php

但:

<?php
..your code
header('Location: page1.php');
...

暫無
暫無

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

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