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

PHP 取得完整 HTTP 原始請求報文的通用實作

     編輯:PHP 相關知識

PHP 取得完整 HTTP 原始請求報文的通用實作

在開發 API、Webhook 或除錯網路問題時,常需完整擷取 HTTP 請求的原始內容(Request Line、Headers、Body)。本文提供一個不依賴 Apache 特有函數、相容 Nginx/CLI 的通用解決方案。

核心步驟

  1. 請求行:從 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI']、$_SERVER['SERVER_PROTOCOL'] 組合。
  2. Headers:遍歷 $_SERVER,篩選 HTTP_ 開頭的鍵,轉換為標準 Header 格式(如 HTTP_USER_AGENT → User-Agent)。
  3. 空行:依 HTTP 規範加入 \r\n 分隔 Header 與 Body。
  4. 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。
  • 此函數回傳的字串可直接寫入日誌或用於簽名驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved