http_response_code

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

http_response_code获取或设置 HTTP 响应代码

描述

http_response_code(int $response_code = 0): int|bool

获取或设置 HTTP 响应状态代码。

参数

response_code

可选的 response_code 将设置响应代码。

返回值

如果提供了 response_code,则将返回先前的状态代码。如果没有提供 response_code,则将返回当前状态代码。如果在 Web 服务器环境中使用,这两个值都将默认设置为 200 状态代码。

false 将在未提供 response_code 且未在 Web 服务器环境中调用(例如从 CLI 应用程序调用)时返回。true 将在提供 response_code 且未在 Web 服务器环境中调用时返回(但仅在没有设置先前的响应状态时)。

示例

示例 #1 在 Web 服务器环境中使用 http_response_code()

<?php

// 获取当前响应代码并设置一个新的
var_dump(http_response_code(404));

// 获取新的响应代码
var_dump(http_response_code());
?>

以上示例将输出

int(200)
int(404)

示例 #2 在 CLI 环境中使用 http_response_code()

<?php

// 获取当前默认响应代码
var_dump(http_response_code());

// 设置响应代码
var_dump(http_response_code(201));

// 获取新的响应代码
var_dump(http_response_code());
?>

以上示例将输出

bool(false)
bool(true)
int(201)

参见

添加说明

用户贡献的说明 18 条说明

192
craig at craigfrancis dot co dot uk
12 年前
如果你的 PHP 版本不包含此函数

<?php

if (!function_exists('http_response_code')) {
function
http_response_code($code = NULL) {

if (
$code !== NULL) {

switch (
$code) {
case
100: $text = 'Continue'; break;
case
101: $text = 'Switching Protocols'; break;
case
200: $text = 'OK'; break;
case
201: $text = 'Created'; break;
case
202: $text = 'Accepted'; break;
case
203: $text = 'Non-Authoritative Information'; break;
case
204: $text = 'No Content'; break;
case
205: $text = 'Reset Content'; break;
case
206: $text = 'Partial Content'; break;
case
300: $text = 'Multiple Choices'; break;
case
301: $text = 'Moved Permanently'; break;
case
302: $text = 'Moved Temporarily'; break;
case
303: $text = 'See Other'; break;
case
304: $text = 'Not Modified'; break;
case
305: $text = 'Use Proxy'; break;
case
400: $text = 'Bad Request'; break;
case
401: $text = 'Unauthorized'; break;
case
402: $text = 'Payment Required'; break;
case
403: $text = 'Forbidden'; break;
case
404: $text = 'Not Found'; break;
case
405: $text = 'Method Not Allowed'; break;
case
406: $text = 'Not Acceptable'; break;
case
407: $text = 'Proxy Authentication Required'; break;
case
408: $text = 'Request Time-out'; break;
case
409: $text = 'Conflict'; break;
case
410: $text = 'Gone'; break;
case
411: $text = 'Length Required'; break;
case
412: $text = 'Precondition Failed'; break;
case
413: $text = 'Request Entity Too Large'; break;
case
414: $text = 'Request-URI Too Large'; break;
case
415: $text = 'Unsupported Media Type'; break;
case
500: $text = 'Internal Server Error'; break;
case
501: $text = 'Not Implemented'; break;
case
502: $text = 'Bad Gateway'; break;
case
503: $text = 'Service Unavailable'; break;
case
504: $text = 'Gateway Time-out'; break;
case
505: $text = 'HTTP Version not supported'; break;
default:
exit(
'Unknown http status code "' . htmlentities($code) . '"');
break;
}

$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');

header($protocol . ' ' . $code . ' ' . $text);

$GLOBALS['http_response_code'] = $code;

} else {

$code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

}

return
$code;

}
}

?>

在这个例子中,我使用了 $GLOBALS,但你可以使用任何你喜欢的存储机制……我认为没有办法返回当前的状态码

https://bugs.php.net/bug.php?id=52555

参考我从 PHP 源代码中获得的错误代码

http://lxr.php.net/opengrok/xref/PHP_5_4/sapi/cgi/cgi_main.c#354

以及当前 http 头部是如何发送的,以及它使用的变量

http://lxr.php.net/opengrok/xref/PHP_5_4/main/SAPI.c#856
65
Stefan W
10 年前
请注意,你不能用这个函数设置任意的响应码,只能设置那些 PHP(或 PHP 运行的 SAPI)已知的响应码。

以下代码目前按预期工作(PHP 作为 Apache 模块运行)
200 – 208, 226
300 – 305, 307, 308
400 – 417, 422 – 424, 426, 428 – 429, 431
500 – 508, 510 – 511

代码 0, 100, 101 和 102 将被发送为 “200 OK”。

其他所有代码都将导致 “500 内部服务器错误”。

如果你想发送具有自由格式状态行的响应,你需要使用 `header()` 函数

<?php header("HTTP/1.0 418 I'm A Teapot"); ?>
16
Thomas A. P.
8 年前
当将响应码设置为非标准码(例如 420)时,Apache 会输出 500 内部服务器错误。

当使用 header(0,0,420) 和 http_response_code(420) 时,会发生这种情况。
改用 header('HTTP/1.1 420 Enhance Your Calm')。

请注意,字符串中的响应码会被解释并用于访问日志以及通过 http_response_code() 输出。
26
Anonymous
10 年前
状态码作为一个数组

<?php
$http_status_codes
= array(100 => "继续", 101 => "切换协议", 102 => "处理中", 200 => "成功", 201 => "已创建", 202 => "已接受", 203 => "非权威信息", 204 => "无内容", 205 => "重置内容", 206 => "部分内容", 207 => "多状态", 300 => "多个选择", 301 => "永久移动", 302 => "已找到", 303 => "查看其他", 304 => "未修改", 305 => "使用代理", 306 => "(未使用)", 307 => "临时重定向", 308 => "永久重定向", 400 => "错误请求", 401 => "未授权", 402 => "需要付款", 403 => "禁止访问", 404 => "未找到", 405 => "方法不允许", 406 => "不可接受", 407 => "需要代理身份验证", 408 => "请求超时", 409 => "冲突", 410 => "已消失", 411 => "需要长度", 412 => "先决条件失败", 413 => "请求实体太大", 414 => "请求 URI 太长", 415 => "不支持的媒体类型", 416 => "请求的范围不可满足", 417 => "期望失败", 418 => "我是一个茶壶", 419 => "身份验证超时", 420 => "保持冷静", 422 => "不可处理", 423 => "已锁定", 424 => "依赖失败", 424 => "方法失败", 425 => "无序集合", 426 => "需要升级", 428 => "需要先决条件", 429 => "请求过多", 431 => "请求头字段太大", 444 => "无响应", 449 => "重试", 450 => "被 Windows 家长控制阻止", 451 => "因法律原因不可用", 494 => "请求头太大", 495 => "证书错误", 496 => "无证书", 497 => "HTTP 到 HTTPS", 499 => "客户端关闭请求", 500 => "服务器内部错误", 501 => "未实现", 502 => "错误网关", 503 => "服务不可用", 504 => "网关超时", 505 => "不支持的 HTTP 版本", 506 => "变体也协商", 507 => "存储空间不足", 508 => "检测到循环", 509 => "带宽限制超出", 510 => "未扩展", 511 => "需要网络身份验证", 598 => "网络读取超时错误", 599 => "网络连接超时错误");
?>

来源: 维基百科 "HTTP 状态码列表"
20
匿名
10 年前
你也可以通过扩展 SplEnum 类来创建枚举。
<?php

/** HTTP 状态码 */
class HttpStatusCode extends SplEnum {
const
__default = self::OK;

const
SWITCHING_PROTOCOLS = 101;
const
OK = 200;
const
CREATED = 201;
const
ACCEPTED = 202;
const
NONAUTHORITATIVE_INFORMATION = 203;
const
NO_CONTENT = 204;
const
RESET_CONTENT = 205;
const
PARTIAL_CONTENT = 206;
const
MULTIPLE_CHOICES = 300;
const
MOVED_PERMANENTLY = 301;
const
MOVED_TEMPORARILY = 302;
const
SEE_OTHER = 303;
const
NOT_MODIFIED = 304;
const
USE_PROXY = 305;
const
BAD_REQUEST = 400;
const
UNAUTHORIZED = 401;
const
PAYMENT_REQUIRED = 402;
const
FORBIDDEN = 403;
const
NOT_FOUND = 404;
const
METHOD_NOT_ALLOWED = 405;
const
NOT_ACCEPTABLE = 406;
const
PROXY_AUTHENTICATION_REQUIRED = 407;
const
REQUEST_TIMEOUT = 408;
const
CONFLICT = 408;
const
GONE = 410;
const
LENGTH_REQUIRED = 411;
const
PRECONDITION_FAILED = 412;
const
REQUEST_ENTITY_TOO_LARGE = 413;
const
REQUESTURI_TOO_LARGE = 414;
const
UNSUPPORTED_MEDIA_TYPE = 415;
const
REQUESTED_RANGE_NOT_SATISFIABLE = 416;
const
EXPECTATION_FAILED = 417;
const
IM_A_TEAPOT = 418;
const
INTERNAL_SERVER_ERROR = 500;
const
NOT_IMPLEMENTED = 501;
const
BAD_GATEWAY = 502;
const
SERVICE_UNAVAILABLE = 503;
const
GATEWAY_TIMEOUT = 504;
const
HTTP_VERSION_NOT_SUPPORTED = 505;
}
6
divinity76 at gmail dot com
4 年前
如果您需要一个 `http_response_code()` 不支持的响应代码,例如 WebDAV / RFC4918 的“HTTP 507 Insufficient Storage”,请尝试

<?php
header
($_SERVER['SERVER_PROTOCOL'] . ' 507 Insufficient Storage');
?>
结果:类似

HTTP/1.1 507 Insufficient Storage
11
Rob Zazueta
11 年前
上面来自“匿名”的说明是错误的。我在 AWS Elastic Loadbalancer 后面运行它,并尝试上面提到的 header(':'.$error_code...) 方法,被视为无效的 HTTP。

如果您仍然使用 < php 5.4,`header()` 函数的文档中有正确的方法来实现这一点。

<?php
header
("HTTP/1.0 404 Not Found");
?>
3
viaujoc at videotron dot ca
3 年前
不要混合使用 `http_response_code()` 和手动设置响应代码头,因为 web 服务器返回的实际 HTTP 状态代码可能与预期不符。如果响应代码先前已使用 `header()` 函数设置,`http_response_code()` 则不起作用。示例

<?php
header
('HTTP/1.1 401 Unauthorized');
http_response_code(403);
print(
http_response_code());
?>

原始 HTTP 响应将是(注意第一行上的实际状态代码与正文中打印的 `http_response_code` 不匹配)

HTTP/1.1 401 Unauthorized
Date: Tue, 24 Nov 2020 13:49:08 GMT
Server: Apache
Connection: Upgrade, Keep-Alive
Keep-Alive: timeout=5, max=100
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

403

我只在 Apache 上测试了它。我不确定这种行为是 Apache 特有的还是所有 PHP 发行版通用的。
15
Anonymous
12 年前
如果您没有 PHP 5.4 并想要更改返回的状态代码,您可以简单地编写
<?php
header
(':', true, $statusCode);
?>

冒号是必须的,否则它将不起作用
7
Richard F.
11 年前
至少在我这边使用 php-fpm 和 nginx,这种方法不会更改响应中的文本,只会更改代码。

<?php

// HTTP/1.1 404 Not Found
http_response_code(404);

?>

结果响应为 HTTP/1.1 404 OK
6
Steven
9 年前
`http_response_code` 本质上是编写 HTTP 状态头的简写方法,它还具有 PHP 会通过将您的响应代码与它在 php-src/main/http_status_codes.h 中维护的枚举值之一匹配来计算出合适的理由短语的额外好处。请注意,这意味着您的响应代码必须与 PHP 知道的响应代码匹配。您不能使用此方法创建自己的响应代码,但是您可以使用 `header` 方法创建。

总之 - 使用“`http_response_code`”和“`header`”设置响应代码之间的区别

1. 使用 `http_response_code` 将导致 PHP 从硬编码到 PHP 源代码中的理由短语列表中匹配并应用一个理由短语。

2. 由于上面的第 1 点,如果您使用 `http_response_code`,则必须设置 PHP 知道的代码。您不能设置自己的自定义代码,但是如果您使用 `header` 方法,则可以设置自定义代码(和理由短语)。
8
stephen at bobs-bits dot com
10 年前
它没有明确提到,但设置时的返回值是旧状态代码。
例如
<?php

$a
= http_response_code();
$b = http_response_code(202);
$c = http_response_code();

var_dump($a, $b, $c);

// Result:
// int(200)
// int(200)
// int(202)
?>
1
yefremov {dot} sasha () gmail {dot} com
9 年前
@craig at craigfrancis dot co dot uk@ 编写了替换原始函数的函数。它非常有用,但有一个错误。原始的 `http_response_code` 始终返回上一个或当前代码,而不是您现在设置的代码。这是我的修复版本。我还使用 `$GLOBALS` 来存储当前代码,但使用 `trigger_error()` 而不是 `exit()`。因此现在,该函数在发生错误时的行为取决于错误处理程序。或者您可以将其改回 `exit()`。

if (!function_exists('http_response_code')) {
function http_response_code($code = NULL) {
$prev_code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);

if ($code === NULL) {
return $prev_code;
}

switch ($code) {
case 100: $text = 'Continue'; break;
case 101: $text = 'Switching Protocols'; break;
case 200: $text = 'OK'; break;
case 201: $text = 'Created'; break;
case 202: $text = 'Accepted'; break;
case 203: $text = 'Non-Authoritative Information'; break;
case 204: $text = 'No Content'; break;
case 205: $text = 'Reset Content'; break;
case 206: $text = 'Partial Content'; break;
case 300: $text = 'Multiple Choices'; break;
case 301: $text = 'Moved Permanently'; break;
case 302: $text = 'Moved Temporarily'; break;
case 303: $text = 'See Other'; break;
case 304: $text = 'Not Modified'; break;
case 305: $text = 'Use Proxy'; break;
case 400: $text = 'Bad Request'; break;
case 401: $text = 'Unauthorized'; break;
case 402: $text = 'Payment Required'; break;
case 403: $text = 'Forbidden'; break;
case 404: $text = 'Not Found'; break;
case 405: $text = 'Method Not Allowed'; break;
case 406: $text = 'Not Acceptable'; break;
case 407: $text = 'Proxy Authentication Required'; break;
case 408: $text = 'Request Time-out'; break;
case 409: $text = 'Conflict'; break;
case 410: $text = 'Gone'; break;
case 411: $text = 'Length Required'; break;
case 412: $text = 'Precondition Failed'; break;
case 413: $text = 'Request Entity Too Large'; break;
case 414: $text = 'Request-URI Too Large'; break;
case 415: $text = 'Unsupported Media Type'; break;
case 500: $text = 'Internal Server Error'; break;
case 501: $text = 'Not Implemented'; break;
case 502: $text = 'Bad Gateway'; break;
case 503: $text = 'Service Unavailable'; break;
case 504: $text = 'Gateway Time-out'; break;
case 505: $text = 'HTTP Version not supported'; break;
default
trigger_error('Unknown http status code ' . $code, E_USER_ERROR); // exit('Unknown http status code "' . htmlentities($code) . '"');
return $prev_code;
}

$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol . ' ' . $code . ' ' . $text);
$GLOBALS['http_response_code'] = $code;

// 原始函数始终返回上一个或当前代码
return $prev_code;
}
}
-1
Chandra Nakka
7 年前
在 PHP 5.3 版本上,如果您想设置 HTTP 响应代码。您可以尝试以下类型的技巧 :)

<?php

header
('Temporary-Header: True', true, 404);
header_remove('Temporary-Header');

?>
-2
Anonymous
6 年前
`http_response_code()` 实际上并不发送 HTTP 头,它只是准备稍后发送的头列表。
因此,您可以在发送 HTTP 响应代码之前调用 `http_reponse_code()` 来设置、获取和重置 HTTP 响应代码。

测试代码
<php
http_response_code(500); // 设置代码
var_dump(headers_sent()); // 检查是否已发送头
http_response_code(200); // 避免默认浏览器页面
-10
Kubo2
8 年前
如果您想要设置 HTTP 响应代码而无需指定协议版本,您实际上可以在没有 `http_response_code()` 的情况下进行操作

<?php

header
('Status: 404', TRUE, 404);

?>
-16
zweibieren at yahoo dot com
9 年前
Stefan W 提供的有限列表已过时。我刚测试了 301 和 302,两者都有效。
-10
divinity76 at gmail dot com
7 年前
警告,它不会检查头是否已发送(如果已发送,它不会 *实际* 更改代码,但后续调用会暗示它确实更改了!!),

您可能想做一些类似的事情
function ehttp_response_code(int $response_code = NULL): int {
if ($response_code === NULL) {
return\ http_response_code();
}
if (\headers_sent()) {
throw new\ Exception('tried to change http response code after sending headers!');
}
return\ http_response_code($response_code);
}
To Top