이 기사의 예에서는 PHP에서 HTTP 요청의 원본 텍스트를 얻는 방법을 설명합니다. 구체적인 단계는 다음과 같습니다.
1. 요청 라인 가져오기: 메서드, URI, 프로토콜
은 슈퍼 변수 $_SERVER에서 얻을 수 있습니다. 세 변수의 값은 다음과 같습니다.
$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n";
2. 모든 헤더 가져오기
PHP에는 apache_request_headers() 함수의 별칭인 getallheader() 함수가 내장되어 있으며, 이 함수는 HTTP 요청의 모든 헤더를 배열 형식으로 반환할 수 있습니다. 하지만 이 기능은 Apache에서만 작동합니다. Nginx나 명령줄로 변경하면 해당 기능이 없다는 오류가 직접 보고됩니다.
더 일반적인 방법은 슈퍼 변수 $_SERVER에서 추출하는 것입니다. 헤더의 키 값은 모두 "HTTP_"로 시작합니다. 이 기능을 기반으로 모든 헤더를 얻을 수 있습니다.
구체적인 코드는 다음과 같습니다.
function get_all_headers() { $headers = array(); foreach($_SERVER as $key => $value) { if(substr($key, 0, 5) === 'HTTP_') { $key = substr($key, 5); $key = strtolower($key); $key = str_replace('_', ' ', $key); $key = ucwords($key); $key = str_replace(' ', '-', $key); $headers[$key] = $value; } } return $headers; }
3. 신체 획득
요청 본문을 얻는 방법을 공식적으로 제공합니다.
file_get_contents('php://input')
4. 최종 완성코드는 다음과 같습니다.
/** * 获取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_') { $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 프로그래밍에 도움이 될 것이라고 믿습니다.