php header函數的問題,比如說header之前不能有實際的輸出

來源:互聯網
上載者:User
原文連結:PHP Header用於頁面跳轉要注意的幾個問題總結 php技巧指令碼之家

搜到了這篇文章,開頭就說了三個關於PHP header()的注意事項,

  1. location和“:”號間不能有空格,否則會出錯。
  2. 在用header前不能有任何的輸出。
  3. header後的PHP代碼還會被執行。

第3點測試結果無誤。

第1點,測試大概是指的 header('Location: http://segmentfault.com/');Location: 不能有空格吧,但其實是可以有的。

主要是第2點,header前不能有任何的輸出有疑問,我測試了下面的代碼,能成功跳轉啊:

asdf

到底要怎樣測試才能報錯呢?php手冊上的“Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP”到底是啥意思?

回複內容:

原文連結:PHP Header用於頁面跳轉要注意的幾個問題總結php技巧指令碼之家

搜到了這篇文章,開頭就說了三個關於PHP header()的注意事項,

  1. location和“:”號間不能有空格,否則會出錯。
  2. 在用header前不能有任何的輸出。
  3. header後的PHP代碼還會被執行。

第3點測試結果無誤。

第1點,測試大概是指的 header('Location: http://segmentfault.com/');Location: 不能有空格吧,但其實是可以有的。

主要是第2點,header前不能有任何的輸出有疑問,我測試了下面的代碼,能成功跳轉啊:

asdf

到底要怎樣測試才能報錯呢?php手冊上的“Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP”到底是啥意思?

header函數內的String原則上會被直接加到HTTP頭裡面去。所以說,如果發送

Location : http://with.blank.com

這種並不符合HTTP規範的HTTP頭,很可能整個HTTP Response都無法解析。
幸運的是,PHP貌似為你修複了這個HTTP頭格式問題。

關於HTTP頭先發的問題,的確不應該在HTTP內容輸出之後輸出HTTP頭。但是伺服器會緩衝輸出,雖然你使用了echo或者print,但在那個時刻伺服器還沒有將這些內容作為HTTP報文輸出,這個時候你仍然有機會修改HTTP頭。

如果你只是單純想要引發一個錯誤的話,很簡單,在header()之前輸出一個絕對超過緩衝大小的HTTP內容就可以了。以下是不良示範。

@scaret 應該是對的, 其實就是緩衝的問題.

";ob_flush();flush();header('Location: http://segmentfault.com/');

得到

Warning: Cannot modify header information - headers already sent by (output started at ...

你把html標籤,換成PHP內部的echo,就會報錯了。
php指令碼中的html標籤,其實是等整個PHP執行完,才會發送給使用者的。
所以在你demo裡面的header('Location : http://segmentfault.com/');前面,並沒有任何輸出。

header('Location : http://segmentfault.com/');這個方法,是在回應標頭裡面,發一個302重新導向。而回應標頭當然要比響應主體要提前輸出。
詳情可以用fiddler抓包看看

樓主你好,我和你有同樣的疑問,我也是在header 200 之前進行了輸出,按照二樓的方法,我甚至輸出了:

//不要輕易加入以下代碼,可能會搞垮你的瀏覽器,只是為了說明for($i = 0; $i < 1e100; $i++) echo $i; 

超過幾十兆的資料,用戶端瀏覽器依然沒有報錯,我猜測可能是web server端(例如apache或者nginx)已經對這種情況進行了最佳化,也許header之前不能有輸出只是一個古老的建議,可能是因為php老版本存在的bug導致的,現在估計這個bug已經被修正,所以沒有把報錯。

另外有人說是因為沒有馬上進行用戶端輸出,所以我使用下面的代碼:

for($i = 0; $i < 1e5; $i++) echo $i;ob_flush();flush();header('HTTP/1.1 200 OK');

依然沒有報錯,誰能解答呢?

我只能說目前的php已經可以識別頭輸出,然後將頭輸出單獨取出然後在response的時候優先輸出,然後就成功避免了header之前有輸出的問題。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.