<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 這部分代碼與文章內容無關,演示前置代碼塊</span></span><span>
</span><span><span class="hljs-title function_ invoke__">date_default_timezone_set</span></span><span>(</span><span><span class="hljs-string">'Asia/Shanghai'</span></span><span>);
</span><span><span class="hljs-variable">$now</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前時間:<span class="hljs-subst">$now</span></span></span><span>\n";
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
在PHP開發過程中,操作HTTP響應頭是非常常見的需求。`</span><span><span class="hljs-title function_ invoke__">header</span></span><span>()`函數允許我們向客戶端發送原始的HTTP頭信息,而`</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>()`函数则可以检测頭信息是否已经发送。合理結合這兩個函數,能够有效避免因重复发送頭信息导致的错误,從而提升程序的健壯性和用戶體驗。
</span><span><span class="hljs-comment">## 1. `header()`函數簡介</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">header</span></span><span>()`用於發送原始HTTP頭。例如,設置跳轉、指定內容類型、控制緩存等:
```php
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/json'</span></span><span>);
</span></span>但是,如果HTTP頭已經發送(比如已經輸出了部分HTML或空白字符),再調用header()就會觸發“Cannot modify header information - headers already sent”的錯誤。
headers_sent()用於檢測HTTP頭是否已經發送給客戶端。它的典型用法:
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>()) {
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Headers already sent, cannot redirect.'</span></span><span>;
}
</span></span>這樣可以避免在頭信息已發送後調用header()導致程序異常。
提前調用header() ,避免輸出任何內容
PHP一旦輸出內容,HTTP頭就會自動發送。因此,確保header()調用前不要有任何echo、print或HTML輸出。
使用headers_sent()做檢測,防止重複發送頭信息<br> 在復雜程序或模板系統中,可能難以完全控制輸出順序,此時使用headers_sent()檢查尤為重要
在發現頭已發送時,採取替代方案<br> 例如,使用JavaScript跳轉或提供手動鏈接,避免程序崩潰
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 假設某處可能已輸出內容</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"歡迎訪問!"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">headers_sent</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$line</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Location: http://example.com'</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<script>window.location.href='http://example.com';</script>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>頁面跳轉失敗,請點擊 <a href='http://example.com'>這裡</a>。</p>"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Headers already sent in <span class="hljs-subst">$file</span></span></span><span> on line </span><span><span class="hljs-subst">$line</span></span><span>.");
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>header()和headers_sent()的結合使用能顯著提高HTTP頭操作的安全性和靈活性。尤其在大型項目或框架中,這種檢測機制能避免因輸出順序錯誤導致的致命錯誤,使代碼更健壯、更易維護。養成良好的輸出控制習慣和使用頭檢測的意識,是PHP開發中的重要最佳實踐。
<span></span>