簡體   English   中英

PHP標頭中的重定向頁面

[英]Header in PHP to redirect the page

我想通過使用標題中的標記來重定向頁面,但是它不起作用。

在頁面頂部,添加以下內容(在任何html或php之前):

<?php
header('Location: http://stackoverflow.com/users/300204/zaf');
exit();
?>

如果那將您重定向到(了不起的程序員的主頁),那么在使用此header()函數之前,您需要檢查是否未輸出任何內容。 在將任何內容發送給用戶之前,必須先調用header()函數。

最常見的原因是“已發送標題”錯誤。 因此,您要解決2個問題。

  1. 由於您的問題中沒有錯誤消息文本,因此我可以假設您沒有此文本。 但是,程序員必須查看發生的所有錯誤消息。 您必須在開發人員的環境中打開display_errors設置on或在生產中查看日志。 此外,必須將error_reporting()級別設置為E_ALL。

  2. 應用程序設計。 您的應用程序必須分為兩部分:業務邏輯和表示邏輯。 第一個從用戶,數據庫等獲取數據。 后一種顯示收集的數據。 在演示邏輯部分開始運行之前,沒有一個字節必須發送到瀏覽器。 在這種情況下,您永遠不會有這樣的錯誤。

BOM是一個例外,BOM-字節順序標記是一種符號,某些編輯器將其靜默地放入文件中。 只需使用“保存而無需BOM”功能。

你需要:

header('Location: http://google.com');

這可能不起作用,因為在標頭之前有一些php輸出,請確保在標頭功能之前沒有任何空格或字符,或者輸出了ECHO。 通常,它將給出一個錯誤,您可以在這里擁有額外的空間,例如“ index.php的第1行的頁面已發送標題”

正如某些人指出的那樣,您必須在內容之前輸出標頭。 做到這一點的理想方法是將業務邏輯和表示邏輯分為不同的部分,但有時您會陷入無法做到這一點的遺留代碼中。

在這種情況下,PHP的輸出控制功能可能會有用。 使用ob_start()和ob_end_flush()捕獲您的輸出,然后最后將其刷新。 這允許您的代碼在任何地方或多或少地使用header()

<?php

function doSomeStuff() {
  echo 'look, outputting stuff here';
  header('Location: /');
}

doSomeStuff();
?>

上面的代碼將為您提供有關已發送標頭的錯誤,但以下代碼將起作用。

<?php
function doSomeStuff() {
  echo 'look, outputting stuff here';
  header('Location: /');
}

ob_start();
doSomeStuff();
ob_end_flush();
?>

在這種情況下,直到ob_end_flush()才發送echo()的輸出,因此header()調用可以正常工作。 這種方法可用於包裝不能正確區分業務和表示邏輯的舊代碼。

暫無
暫無

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

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