PHP HTTP 函数

HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作,包括HTTP头、Cookie和响应状态。

PHP HTTP 简介

HTTP 函数允许您在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作。

这些函数主要用于:

  • 设置HTTP响应头
  • 管理Cookie
  • 控制HTTP缓存
  • 处理HTTP状态码
  • 重定向和页面跳转
重要说明

HTTP函数必须在任何实际输出之前调用(包括空格和HTML标签),否则会导致"Headers already sent"错误。

安装说明

HTTP 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

PHP HTTP 函数列表

函数 描述 版本
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+

HTTP 状态码常量

虽然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 充当网关或代理的服务器,未及时从远端服务器获取请求。

使用示例

HTTP头操作示例
// 检查头部是否已发送
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操作示例
// 设置简单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响应码
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);
高级HTTP操作
// 获取请求头
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()
  • 设置Cookie时使用HttpOnlySecure标志增强安全性
  • 重定向后立即使用exit()die()终止脚本执行
  • 为API响应设置正确的Content-Type头
  • 使用适当的HTTP状态码传达准确的响应信息
  • 清理用户输入,防止HTTP头注入攻击
  • 考虑使用输出缓冲来避免"Headers already sent"错误
安全注意事项
  • HTTP头注入:不要将用户输入直接用于HTTP头,始终验证和过滤
  • Cookie安全:对敏感信息使用安全标志(Secure、HttpOnly)
  • 重定向验证:验证重定向URL,防止开放重定向攻击
  • 缓存控制:对敏感内容禁用缓存
  • 跨域资源共享:谨慎设置CORS头,避免不必要的跨域访问
  • 信息泄露:移除或修改可能泄露服务器信息的头(如X-Powered-By)