PHP处理HTTP响应
一、 分割头部和正文
list($headers, $status) = explode("\r\n\r\n", $status, 2);
功能
将变量 $status(实际应包含完整的HTTP响应内容)按 \r\n\r\n(HTTP协议中头部与正文的分隔符)分割为最多两部分:
$headers:保存状态行(如 HTTP/1.1 200 OK)和所有头部字段。
$status:保存响应正文(变量名误导,应改为 $body)。
二、发送HTTP头部
foreach (explode("\r\n", $headers) as $header) {
header($header);
}
功能
将 $headers 按 \r\n 拆分为多行,逐行调用 header() 函数发送HTTP头。
关键点
状态行的处理:首行通常是状态行(如 HTTP/1.1 200 OK),header() 函数能正确识别并设置状态码。
逐行发送头部:包括 Content-Type、Location 等标准或自定义头部。
三、处理例子
// 假设 $response 包含完整的HTTP响应
$parts = explode("\r\n\r\n", $response, 2);
// 检查是否成功分割头部和正文
if (count($parts) < 2) {
throw new Exception("Invalid HTTP response: Missing body.");
}
list($headersPart, $body) = $parts;
// 统一换行符为 \n,再分割头部行
$headersPart = str_replace("\r\n", "\n", $headersPart);
$headerLines = explode("\n", $headersPart);
foreach ($headerLines as $header) {
$header = trim($header);
if ($header === '') {
continue; // 跳过空行
}
// 可选:过滤危险头部(如 Location)
if (stripos($header, 'Location:') === 0) {
continue;
}
header($header);
}
// 输出正文
echo $body;