簡體   English   中英

http_response_code() 不工作,總是輸出 200

[英]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_bufferingPHP_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM