發(fā)送頭消息前不能有任何輸出,任何修改或者發(fā)送HTTP頭的函數(shù)都必須在 任何形式的輸出 之前被調(diào)用,一些函數(shù)會(huì)修改HTTP頭:
header/header_remove
session_start/session_regenerate_id
setcookie/setrawcookie
而輸出主要可能如下:
隱性輸出
在 <?php 之前或者 ?> 之后的空格
UTF-8文件的 BOM頭
之前出現(xiàn)的報(bào)錯(cuò)信息
顯性輸出
print , echo 和其它類似的輸出函數(shù)
在 <?php 之間嵌入的原始html
為什么會(huì)出現(xiàn)Cannot modify header information – headers already sent by錯(cuò)誤
為了理解為什么頭消息必須早于輸出,我們來看看典型的HTTP響應(yīng)。PHP主要是生成HTML內(nèi)容,但同時(shí)也傳輸了一組 HTTP/CGI 頭給webserver:
- HTTP/1.1 200 OK
- Powered-By: PHP/5.3.7
- Vary: DontTrackMeHere
- Content-Type: text/html; charset=utf-8
- <html><head><title>PHP page output page</title></head>
- <body><h1>Content</h1> <p>Some more output follows...</p>
- and <a href="/"> <img src=internal-icon-delayed> </a>
輸出總是尾隨頭消息出現(xiàn)。PHP必須首先傳頭消息給網(wǎng)頁(yè)服務(wù)器,并且只能傳一個(gè)。在兩個(gè)換行之后再也不能為頭消息添加任何內(nèi)容了。
當(dāng)PHP收到第一個(gè)輸出后(例:print,echo,…),它會(huì)刷新并發(fā)送設(shè)置的所有頭信息。然后就可以就可以隨心所欲的輸出了,但是此時(shí)已經(jīng)無法修改HTTP頭信息了。
如何找到早于頭消息的輸出,報(bào)錯(cuò)信息中已經(jīng)包含了所有相關(guān)能夠定位錯(cuò)誤的信息:
Warning: Cannot modify header information - headers already sent by (output started at /www/usr2345/htdocs/auth.php:52) in /www/usr2345/htdocs/index.php on line 100
可以看到header在文件的100行被調(diào)用。
“output started at” 則包含著更重要的信息:直接指名在auth.php的52行已經(jīng)產(chǎn)生了輸出。這就是我們需要找的。
一般情況:
print,echo
原始的HTML語句
<!DOCTYPE html>
- <?php
- //已經(jīng)不能修改或發(fā)送頭消息了
- <?php 之前的空格
- <?php
- //這里有一個(gè)空格
- UTF-8 BOM
這是更不易察覺,但比較普遍出現(xiàn)的情況。確保用你的編輯器保存文件以“UTF-8 (no BOM)”方式保存。
報(bào)錯(cuò)信息形如 “Unknown on line 0”
一般這樣的報(bào)錯(cuò)說明輸出來自PHP擴(kuò)展或者PHP.ini設(shè)置錯(cuò)誤信息
新聞熱點(diǎn)
疑難解答