[問題] headers already sent
這種問題板上很多人問過了,多爬文。
我在這篇文章改標題,有沒有參考價值,板主是否保留都隨意。
依照 HTTP 協定,網頁瀏覽器存取網頁時會進行連線,取得檔頭資訊,再取用內容。
如果直接以 telnet 命令模擬 GET 指令,取到的內容會像這樣:
(沒特別指定都是 GET,其他還有 HEAD、POST、...)
Date: Wed, 07 May 2008 21:23:37 GMT
Server: Apache
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "4135d-2c-3e9564c23b600"
Accept-Ranges: bytes
Content-Length: 44
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
<html><body><h1>It works!</h1></body></html>
黃色的部份就是檔頭(header),綠色部份是內容。
HTML 文件裡面也可以包檔頭,用來修正文件文件存取的方式、位址,
以及網頁編碼等等的資訊,像這樣:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Big5" />
<title>Hello PHP 網頁</title>
</head>
<body>
......
</body>
<html>
黃色的的 <head> 與 </head> 包起來的紅色部份就是 HTML 裡面的檔頭,
綠色的部份才是內容。
為了讓瀏覽器能正確解析檔案,網頁伺服器一定先送出檔頭,再送出內容。
編寫 HTML 也一樣, <head> 一定放在 <body> 前面。
基於安全性等因素考量,許多網頁程式語言引擎不允許某些檔頭資訊在後段作傳送。
PHP 的內部引擎就是其中的一種,所以,不要在 <body> 開始後,
又開始傳送應該放在 <head> 裡面的資訊。
而 PHP 的 header() 這個 function 就是讓我們傳送檔頭的。
作 header("Location: ....") 的話似乎是沒這種禁忌,以後會不會改不知道。
※ 引述《polito (波力多)》之銘言:
: 這是我遇到的問題....
: Warning: Cannot modify header information - headers already sent by
: (output started at C:\AppServ\www\....\abc.php:18)
: in C:\AppServ\www\....\def.php on line 43
abc.php 已經送完檔頭,進入 <body> 了,隨之而來的程式不應該再送出檔頭。
另外,不好意思,我覺得您的程式結構很差,
html_begin() 之類的 function 不應該跑超過一次。
建議您把檔頭傳送等等的步驟作成一個 function,
讓可能變動的字串或數值變成應該傳入的變數。
需要送檔頭的頁面、PHP 檔只要呼叫 function,傳遞變數,作一次就好。
--
▄▆▇▍ ▄▆ ▇ ▏▎▍▌▋▊▉ φkaishin
▌▄ ▋▊ ▄▏▎ ▎▏ │
┼── ▄–█▏─▂── ▁▁─▇▍▍▁▏ ──▂───◢── JoeHorn┬┼
□ ▄▄▄ꈠ ▇ ▄ ▂▄█▎ ▄▄▃▉ ▇ ▄ ◢▆◢ ▄▎▄▅ └┼
┼┐▄▄▄▄ ▂ ▅▃◤▃▆◢▂◤▄ ▏▃▂ ▅▃▆◢ ▄█▄▆▋▄ □
┼┴ ▄ ▄▆─▄▂▂-◣▄▂▄-▄▃──▄▌▄▂▂─ ▃◤-▄ ─▊▅◤─┼
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.173.193
推
05/08 07:25, , 1F
05/08 07:25, 1F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章
6
14