首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 取得完整 HTTP 原始請求報文 (Request Line、Headers、Body)

     編輯:PHP 相關知識

除錯 API、Webhook、Proxy 轉發時,常需完整重現客戶端發送的原始 HTTP 報文。本文整理從 $_SERVER 重建請求行、解析所有 Header、讀取 Body 的完整函數 get_http_raw(),相容 Apache/Nginx/CLI 環境。

三大組成部分

  1. 請求行:$_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL']
  2. Headers:$_SERVER 中 HTTP_ 開頭鍵值轉換(HTTP_CONTENT_TYPE → Content-Type)。
  3. Body:file_get_contents('php://input') 讀取原始輸入流。

完整函數

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_') {
            $key = substr($key, 5);
            $key = str_replace('_', '-', $key);
            $raw .= $key . ': ' . $value . "\r\n";
        }
    }
    // (3) 空行分隔
    $raw .= "\r\n";
    // (4) Body
    $raw .= file_get_contents('php://input');
    return $raw;
}

注意事項

  • php://input 無法讀取 multipart/form-data(檔案上傳),需改用 $_FILES。
  • Nginx + PHP-FPM 環境下 getallheaders() 不可用,本函數透過 $_SERVER 相容性最佳。
  • 大型 Body 會佔用記憶體,生產環境謹慎記錄完整 Body,建議截斷或摘要。
  • HTTPS 環境下 $_SERVER['HTTPS']、$_SERVER['SSL_*'] 可補充協資訊。

應用場景

  • API 請求日誌完整留存
  • Webhook 簽章驗證需原始報文
  • Proxy/轉發服務重構上游請求
  • 安全審計與異常流量分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved