完整 HTTP 請求包含四部分:請求行、Header、空行、Body。PHP 可透過超全域變數與輸入流重建原始報文。
從 $_SERVER 取得方法、URI、協議版本:
$_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\r\n";
getallheaders() 僅支援 Apache。通用做法從 $_SERVER 篩選 HTTP_ 開頭的鍵:
function get_all_headers(): array {
$headers = [];
foreach ($_SERVER as $key => $value) {
if (strncmp($key, 'HTTP_', 5) === 0) {
$key = substr($key, 5);
$key = str_replace('_', '-', $key);
$key = ucwords(strtolower($key));
$headers[$key] = $value;
}
}
return $headers;
}
標準方式讀取 php://input 流(不適用 multipart/form-data):
file_get_contents('php://input')
function get_http_raw(): string {
$raw = '';
// 請求行
$raw .= $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\r\n";
// Headers
foreach ($_SERVER as $key => $value) {
if (strncmp($key, 'HTTP_', 5) === 0) {
$headerName = substr($key, 5);
$headerName = str_replace('_', '-', $headerName);
$raw .= $headerName . ': ' . $value . "\r\n";
}
}
// 空行
$raw .= "\r\n";
// Body
$raw .= file_get_contents('php://input');
return $raw;
}