HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作。
这些函数主要用于:
HTTP函数必须在任何实际输出之前调用(包括空格和HTML标签),否则会导致"Headers already sent"错误。
HTTP 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。
| 函数 | 描述 | 版本 |
|---|---|---|
| header() | 向客户端发送原始的 HTTP 报头。 | PHP 4+ |
| headers_list() | 返回已发送的(或待发送的)响应头部的一个列表。 | PHP 5+ |
| headers_sent() | 检查 HTTP 报头是否发送/已发送到何处。 | PHP 4+ |
| setcookie() | 向客户端发送一个 HTTP cookie。 | PHP 4+ |
| setrawcookie() | 不对 cookie 值进行 URL 编码,发送一个 HTTP cookie。 | PHP 5+ |
| http_response_code() | 获取或设置HTTP响应状态码。 | PHP 5.4+ |
| header_register_callback() | 注册一个函数,在发送头部时调用。 | PHP 5.4+ |
| header_remove() | 移除之前设置的HTTP头。 | PHP 5.3+ |
| getallheaders() | 获取所有HTTP请求头。 | PHP 4+ |
| apache_request_headers() | 获取Apache请求头。 | PHP 5+ |
| apache_response_headers() | 获取Apache响应头。 | PHP 5+ |
| get_headers() | 获取URL的HTTP响应头。 | PHP 5+ |
| http_build_query() | 生成URL-encode之后的请求字符串。 | PHP 5+ |
| http_build_cookie() | 构建HTTP Cookie字符串。 | PHP 7.3+ |
虽然PHP没有专门的HTTP常量,但以下是一些常用的HTTP状态码:
| 状态码 | 常量 | 描述 |
|---|---|---|
| 100 | HTTP_CONTINUE | 继续。客户端应继续其请求。 |
| 101 | HTTP_SWITCHING_PROTOCOLS | 切换协议。服务器根据客户端的请求切换协议。 |
| 200 | HTTP_OK | 请求成功。 |
| 201 | HTTP_CREATED | 已创建。成功请求并创建了新的资源。 |
| 204 | HTTP_NO_CONTENT | 无内容。服务器成功处理,但未返回内容。 |
| 301 | HTTP_MOVED_PERMANENTLY | 永久移动。请求的资源已永久移动到新URI。 |
| 302 | HTTP_FOUND | 临时移动。资源临时从不同的URI响应请求。 |
| 304 | HTTP_NOT_MODIFIED | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。 |
| 400 | HTTP_BAD_REQUEST | 客户端请求的语法错误,服务器无法理解。 |
| 401 | HTTP_UNAUTHORIZED | 请求要求用户的身份认证。 |
| 403 | HTTP_FORBIDDEN | 服务器理解请求客户端的请求,但是拒绝执行此请求。 |
| 404 | HTTP_NOT_FOUND | 服务器无法根据客户端的请求找到资源。 |
| 405 | HTTP_METHOD_NOT_ALLOWED | 客户端请求中的方法被禁止。 |
| 429 | HTTP_TOO_MANY_REQUESTS | 用户在给定的时间内发送了太多的请求。 |
| 500 | HTTP_INTERNAL_SERVER_ERROR | 服务器内部错误,无法完成请求。 |
| 501 | HTTP_NOT_IMPLEMENTED | 服务器不支持请求的功能,无法完成请求。 |
| 502 | HTTP_BAD_GATEWAY | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。 |
| 503 | HTTP_SERVICE_UNAVAILABLE | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。 |
| 504 | HTTP_GATEWAY_TIMEOUT | 充当网关或代理的服务器,未及时从远端服务器获取请求。 |
// 检查头部是否已发送
if (!headers_sent()) {
// 设置内容类型
header('Content-Type: text/html; charset=utf-8');
// 设置缓存控制
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
// 设置自定义头
header('X-Powered-By: PHP/7.4.3');
header('X-Content-Type-Options: nosniff');
} else {
echo "头部已发送,无法设置新的头部信息\n";
}
// 获取已设置的头部列表
$headers = headers_list();
echo "已设置的HTTP头:\n";
foreach ($headers as $header) {
echo " - " . $header . "\n";
}
// 移除指定的HTTP头
header_remove('X-Powered-By');
// 注册头部发送时的回调函数
header_register_callback(function() {
echo "头部正在发送...\n";
});
// 设置简单Cookie(24小时过期)
setcookie('username', 'john_doe', time() + 86400, '/');
// 设置安全的HttpOnly Cookie
setcookie('session_id', 'abc123def456', [
'expires' => time() + 86400,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict'
]);
// 设置不进行URL编码的Cookie
setrawcookie('raw_data', 'value with spaces & special chars!', time() + 3600);
// 删除Cookie(设置过期时间为过去)
setcookie('old_cookie', '', time() - 3600);
// 构建Cookie字符串
$cookie_data = [
'name' => 'test_cookie',
'value' => 'test_value',
'expires' => time() + 3600,
'path' => '/',
'domain' => 'example.com'
];
// PHP 7.3+ 可以使用http_build_cookie()
if (function_exists('http_build_cookie')) {
$cookie_string = http_build_cookie($cookie_data);
echo "Cookie字符串: " . $cookie_string . "\n";
}
// 从请求中读取Cookie
if (isset($_COOKIE['username'])) {
echo "用户名: " . htmlspecialchars($_COOKIE['username']) . "\n";
}
// 设置HTTP响应码
http_response_code(200); // OK
echo "当前响应码: " . http_response_code() . "\n";
// 重定向到另一个页面
header('Location: https://www.example.com/new-page.php');
exit(); // 重定向后立即退出
// 设置不同的响应码
http_response_code(404); // Not Found
// 然后可以显示404错误页面
// 永久重定向(301)
http_response_code(301);
header('Location: https://www.example.com/permanent-redirect');
exit();
// 创建API响应
function json_response($data, $status_code = 200) {
http_response_code($status_code);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);
exit();
}
// 使用示例
$response = [
'status' => 'success',
'data' => [
'id' => 123,
'name' => 'John Doe',
'email' => 'john@example.com'
]
];
// 发送JSON响应
// json_response($response, 200);
// 错误响应
$error_response = [
'status' => 'error',
'message' => 'Invalid request parameters'
];
// json_response($error_response, 400);
// 获取请求头
if (function_exists('getallheaders')) {
$headers = getallheaders();
echo "所有请求头:\n";
foreach ($headers as $name => $value) {
echo " - $name: $value\n";
}
}
// 获取远程URL的HTTP头
$url = 'https://www.example.com';
$headers = get_headers($url);
echo "URL $url 的响应头:\n";
foreach ($headers as $header) {
echo " - " . $header . "\n";
}
// 构建查询字符串
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'age' => 30,
'interests' => ['php', 'javascript', 'python']
];
$query_string = http_build_query($data);
echo "查询字符串: " . $query_string . "\n";
// 使用不同编码格式
$query_rfc1738 = http_build_query($data, '', '&', PHP_QUERY_RFC1738);
$query_rfc3986 = http_build_query($data, '', '&', PHP_QUERY_RFC3986);
echo "RFC1738编码: " . $query_rfc1738 . "\n";
echo "RFC3986编码: " . $query_rfc3986 . "\n";
// 强制下载文件
$file_path = '/path/to/file.pdf';
$file_name = 'document.pdf';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $file_name . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit();
header()函数之前检查headers_sent()HttpOnly和Secure标志增强安全性exit()或die()终止脚本执行