问答中心分类: PHPPHP:如何发送HTTP响应代码?
0
匿名用户 提问 4天 前

我有一个PHP脚本,需要用HTTP响应代码(状态代码)做出响应,比如HTTP 200 OK,或者一些4XX或5XX代码。
如何在PHP中实现这一点?

7 Answers
0
Grigore Madalin 回答 4天 前

不幸的是,我发现@dualed提出的解决方案有各种缺陷。

  1. 使用substr($sapi_type, 0, 3) == 'cgi'不足以检测快速CGI。使用PHP-FPM FastCGI Process Manager时,php_sapi_name()返回fpm而非cgi
  2. Fasctcgi和php-fpm暴露了@Josh提到的另一个bug-使用header('X-PHP-Response-Code: 404', true, 404);在PHP-FPM(FastCGI)下工作正常
  3. header("HTTP/1.1 404 Not Found");当协议不是HTTP/1.1(即“HTTP/1.0”)时,可能会失败。必须使用检测当前协议$_SERVER['SERVER_PROTOCOL'](自PHP 4.1.0起提供)
  4. 呼叫时至少有2个案例http_response_code()导致意外行为:
    • 当PHP遇到它不理解的HTTP响应代码时,PHP将用它从同一组中知道的代码替换该代码。例如,“521 Web server is down”替换为“500 Internal server Error”。来自其他组2xx、3xx、4xx的许多其他不常见响应代码都是这样处理的。
    • 在具有php fpm和nginx http\u response\u code()的服务器上,函数可能会按预期更改代码,但不会更改消息。例如,这可能会导致奇怪的“404 OK”标题。PHP网站上的一条用户评论也提到了这个问题http://www.php.net/manual/en/function.http-response-code.php#112423

这里有HTTP响应状态代码的完整列表供您参考(该列表包括IETF互联网标准以及其他IETF RFC的代码。其中许多代码目前不受PHP HTTP\u response\u代码功能的支持):http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
您可以通过调用以下命令轻松测试此错误:

http_response_code(521);

如果您有一个自定义客户端应用程序调用您的服务器并需要一些额外的HTTP代码,则服务器将发送“500 Internal server Error”HTTP响应代码,从而导致意外错误。

我的解决方案(适用于自4.1.0以来的所有PHP版本):

$httpStatusCode = 521;
$httpStatusMsg  = 'Web server is down';
$phpSapiName    = substr(php_sapi_name(), 0, 3);
if ($phpSapiName == 'cgi' || $phpSapiName == 'fpm') {
    header('Status: '.$httpStatusCode.' '.$httpStatusMsg);
} else {
    $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
    header($protocol.' '.$httpStatusCode.' '.$httpStatusMsg);
}

结论
http\u response\u code()实现不支持所有http响应代码,可能会用同一组中的另一个http响应代码覆盖指定的http响应代码。
新的http\u response\u code()函数并没有解决所有涉及的问题,但引入了新的bug,使情况变得更糟。
@dualed提供的“兼容性”解决方案并没有按预期工作,至少在PHP-FPM下是这样。
@dualed提供的其他解决方案也有各种缺陷。快速CGI检测无法处理PHP-FPM。必须检测当前协议。
如有任何测试和意见,我们将不胜感激。

John 回复 4天 前

使用PHP 8.0/HTTP 429时,Gecko和Blink浏览器上的请求过多。

0
Seyed Ali Roshan 回答 4天 前

由于PHP 5.4,您可以使用http_response_code()用于获取和设置标题状态代码。
举个例子:

<?php

// Get the current response code and set a new one
var_dump(http_response_code(404));

// Get the new response code
var_dump(http_response_code());
?>

这是这个函数在php中的文档。净值:
http\U响应代码

Scruffy 回复 4天 前

根据我的经验,这是最好的答案。

Tomas Gonzalez 回复 4天 前

为什么使用var_dump()?

Tomas Gonzalez 回复 4天 前

但是为什么用var_dump()代替echo呢?结果是否不适用于简单回波?甚至print\u r()。var_dump()似乎不足以生成代码。。。

Seyed Ali Roshan 回复 4天 前

@TomasGonzalez这没什么大不了的,我只是想通过用var_dump()打印所有内容来向你展示其中的内容,没错,它们并不重要

Tomas Gonzalez 回复 4天 前

好的,我明白了。引起我注意的是,在官方文档中,示例也使用了var_dump()。所以我很好奇这样做的原因。我可能错过了什么。php。net/manual/en/function。http响应代码。php

0
sparkey0 回答 4天 前

如果不使用输出缓冲,请在正文的任何输出之前添加此行。

header("HTTP/1.1 200 OK");

将消息部分(“OK”)替换为适当的消息,将状态代码替换为适当的代码(404501等)

FMaz008 回复 4天 前

我们发出的信息(删除OK)可以是什么?

Surjith S M 回复 4天 前

这对我很有效。我当时正在用PHP 5.3在一个网站上制作一个联系人表单。这个解决方案对我有效。它将为AJAX请求完成失败函数提供响应文本和此HTTP代码。这就是我想要的。

0
jaggedsoft 回答 4天 前

如果您在这里是因为Wordpress在加载环境时提供404,这应该可以解决问题:

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
status_header( 200 );
//$wp_query->is_404=false; // if necessary

问题是因为它发送了一个状态:404未找到标头。你必须覆盖它。

define('WP_USE_THEMES', false);
require('../wp-blog-header.php');
header("HTTP/1.1 200 OK");
header("Status: 200 All rosy");
0
Quentin 回答 4天 前

header作用本节中有一个关于它采用的第一个参数的示例。