[英]http_response_code() not working, always output 200
echo http_response_code('400');
return "error";
我有一個頁面需要輸出http
狀態
我設置了http_response_code(400)
並嘗試使用郵遞員發布。
它總是返回 200。
為什么http_response_code
不起作用?
也許您在調用 http_response_code() 之前已經發送了一些輸出。 它會在沒有警告的情況下靜默地導致 HTTP 200 (它不會發出眾所周知的標頭已經發送)。 您可以發送一些輸出,但不能超過 php 指令output_buffering
值(請參閱您的 phpinfo 頁面)。 通常設置為 4096 字節 (4kB)。 嘗試將 php.ini 中的output_buffering
臨時增加到更高的值(不要忘記重新啟動網絡服務器)。 請注意, output_buffering
是PHP_INI_PERDIR
類型,不能在運行時更改,例如通過 ini_set()。
PHP_INI_PERDIR: Entry can be set in php.ini, .htaccess, httpd.conf or .user.ini
我建議使用整數而不是字符串: http_response_code(400)
... 只是為了與 PHP 文檔保持一致。 但是http_response_code()
也適用於字符串 - 我現在已經對其進行了測試,因此字符串不會像@DiabloSteve 在評論中指出的那樣導致您的問題。
你不需要像你那樣返回你的函數:
return "error";
回答
您需要像這樣退出您的功能:
http_response_code(400);
exit;
還echo
和像字符串一樣的錯誤代碼是多余的
你得到一個持久的 200 ok 響應代碼的原因是因為你在你的 php 標簽之前有一些輸入(換行符):
線 1 線 2
這也可以在 php 標簽之間:
線 1 線 2
確保刪除這些輸入,否則這些換行符將被視為輸出。 這就是為什么您在此之后投入的任何 http_response_code(xxx) 都沒有影響的原因,因為換行符輸出代表“200 ok”響應。 我已經用 r-client 模擬了您的問題(應該與 chrome 上的郵遞員相同)。
就我而言,它是
<pre>
<?php
http_response_code(404);
?>
</pre>
此代碼返回 200,因為在 php 啟動之前, pre標簽已經發送
<?php
http_response_code(404);
成功返回 404,因為尚未發送任何內容。
<?php之前甚至不允許有空格,否則將返回 200
你需要像這樣調用http_response_code
兩次
http_response_code(400); // this will get previous response code 200 and set a new one to 400
echo http_response_code(); // this will get previous response code which is now 400
return;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.