作者JoeHorn (每天都在公司玩OLG)
看板PHP
标题[问题] headers already sent
时间Thu May 8 05:53:33 2008
这种问题板上很多人问过了,多爬文。
我在这篇文章改标题,有没有参考价值,板主是否保留都随意。
依照 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
1F:推 polito:感谢您的讲解 我试试看 05/08 07:25