在開發 API、Webhook 或除錯網路問題時,常需完整擷取 HTTP 請求的原始內容(Request Line、Headers、Body)。本文提供一個不依賴 Apache 特有函數、相容 Nginx/CLI 的通用解決方案。
$_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI']、$_SERVER['SERVER_PROTOCOL'] 組合。$_SERVER,篩選 HTTP_ 開頭的鍵,轉換為標準 Header 格式(如 HTTP_USER_AGENT → User-Agent)。\r\n 分隔 Header 與 Body。file_get_contents('php://input') 讀取原始輸入流。<?php
/**
* 取得完整 HTTP 原始請求報文
* @return string
*/
function get_http_raw() {
$raw = '';
// (1) 請求行
$raw .= $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\r\n";
// (2) Headers
foreach ($_SERVER as $key => $value) {
if (substr($key, 0, 5) === 'HTTP_') {
$headerKey = substr($key, 5);
$headerKey = str_replace('_', '-', $headerKey);
$raw .= $headerKey . ': ' . $value . "\r\n";
}
}
// (3) 空行
$raw .= "\r\n";
// (4) Body
$raw .= file_get_contents('php://input');
return $raw;
}
?>
getallheaders() 僅適用於 Apache 環境,不具通用性。php://input 無法讀取 multipart/form-data 的檔案上傳資料,該場景請改用 $_FILES。