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

PHP 完整獲取 HTTP 原始請求報文:請求行、Header、Body

     編輯:PHP 綜合知識

HTTP 請求結構回顧

完整 HTTP 請求包含四部分:請求行、Header、空行、Body。PHP 可透過超全域變數與輸入流重建原始報文。

1. 取得請求行

從 $_SERVER 取得方法、URI、協議版本:

$_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\r\n";

2. 取得所有 Header

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;
}

3. 取得請求 Body

標準方式讀取 php://input 流(不適用 multipart/form-data):

file_get_contents('php://input')

4. 完整重建函數

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;
}

應用場景

  • API 除錯與日誌記錄
  • 簽名驗證(需原始報文計算簽名)
  • 代理轉發時保持請求原貌
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved