Tiêu đề HTTP rất quan trọng để trao đổi thông tin giữa trình duyệt và máy chủ. Chúng có hai loại - tiêu đề yêu cầu và tiêu đề phản hồi. Bài viết này bao gồm các tiêu đề phản hồi
Cách gửi tiêu đề phản hồi HTTP
Vì các tiêu đề phản hồi được gửi bởi máy chủ, nên cần phải sử dụng các công cụ ngôn ngữ lập trình, ví dụ: các cơ sở PHP. Nó có các chức năng đặc biệt để làm việc với các tiêu đề. Để gửi tiêu đề - chức năng tiêu đề
Bạn chỉ có thể gửi tiêu đề nếu chưa có dữ liệu nào được gửi. Trước khi gọi chức năng này, không được có thẻ HTML, dòng trống, v.v. , bao gồm trong các tập tin bao gồm. Nghĩa là, các tiêu đề được gửi trước, sau đó là chính dữ liệu
Ví dụ gửi tiêu đề tới PHP tới trình duyệt
header ['HTTP / 1.1 404 Not Found'];
header ['Status: 404 Not Found'];
header ['Location: // example.com'];
Cách nhận tiêu đề phản hồi HTTP
Các chức năng sau đây có sẵn cho việc này
- get_headers - trả về tất cả các tiêu đề từ phản hồi của máy chủ đối với yêu cầu HTTP;
- apache_response_headers - Trả về danh sách tất cả các tiêu đề phản hồi HTTP của Apache;
- http_response_code - nhận hoặc đặt mã phản hồi HTTP;
- headers_list - Trả về danh sách các tiêu đề đã gửi [hoặc sẵn sàng gửi]
Bạn cũng có thể sử dụng thư viện CURL. Làm cách nào để nhận tiêu đề phản hồi bằng CURL?
if [$ curl = curl_init ['//example.com']] {
curl_setopt [$ curl, CURLOPT_RETURNTRANSFER, true];
curl_setopt [$ curl, CURLOPT_NOBODY, true];
curl_setopt [$ curl, CURLOPT_HEADER, true];
$ out = curl_exec [$ curl];
echo $ out;
curl_close [$ curl];
}
Cách xóa tiêu đề phản hồi HTTP
Có thể xóa tiêu đề bằng chức năng đặc biệt - header_remove. Trước tiên, bạn cần kiểm tra xem các tiêu đề đã được gửi chưa
if [! headers_sent []] {
header_remove ['Content-Type'];
}
Như bạn có thể thấy từ bài viết, rất dễ làm việc với các tiêu đề phản hồi HTTP ở phía máy chủ
Khi sử dụng file_get_contents để thực hiện các yêu cầu HTTP, các tiêu đề phản hồi của máy chủ được lưu trữ trong một biến dành riêng sau mỗi yêu cầu thành công;
2291 lượt xem
Bởi. Jacob
Đã chỉnh sửa. 2022-03-18 11. 51
Khi bạn đang sử dụng các hàm tệp PHP dựng sẵn để thực hiện các yêu cầu HTTP, các tiêu đề phản hồi sẽ tự động được cung cấp trong một biến đặc biệt, $http_response_header; . Trong hướng dẫn này, bạn sẽ học cách phân tích cú pháp các tiêu đề yêu cầu bất kể bạn đang sử dụng cURL hay các hàm tệp như file_get_contents
Hơi lạ là các tiêu đề được lưu trữ dưới dạng một mảng được lập chỉ mục, thay vì một mảng kết hợp thân thiện với người dùng hơn;
Để phân tích các tiêu đề phản hồi và tạo một mảng kết hợp, chúng ta có thể sử dụng giải pháp này cho các hàm tệp tích hợp
$response_headers = []; $status_message = array_shift[$http_response_header]; foreach [$http_response_header as $value] { if[false !== [$matches = explode[':', $value, 2]]] { $response_headers["{$matches[0]}"] = trim[$matches[1]]; } }
Và cái này khi sử dụng thư viện cURL
// Define the $response_headers array for later use $response_headers = []; // Get the first line [The Status Code] $line = strtok[$headers, "\r\n"]; $status_code = trim[$line]; // Parse the string, saving it into an array instead while [[$line = strtok["\r\n"]] !== false] { if[false !== [$matches = explode[':', $line, 2]]] { $response_headers["{$matches[0]}"] = trim[$matches[1]]; } }
Làm điều này giúp bạn có thể dễ dàng kiểm tra xem một tiêu đề đã cho có tồn tại hay không, chỉ đơn giản bằng cách sử dụng isset trên khóa mảng
if [isset[$response_headers["content-type"]]] { echo 'The "content-type" header was found, and the content is:
'; echo $response_headers["content-type"]; exit[]; }
tập tin chức năng
Như đã đề cập trước đó, để có được các tiêu đề phản hồi bằng cách sử dụng các hàm tệp dựng sẵn của PHP, bạn có thể lặp qua biến $http_response_header;
Các chức năng được sử dụng để thực hiện các yêu cầu HTTP bằng cách sử dụng các hàm tệp thường bao gồm file_get_contents, stream_context_create và stream_get_contents — cách sử dụng chúng sẽ được trình bày trong các hướng dẫn khác
Phần tử đầu tiên trong mảng $http_response_header luôn là mã trạng thái HTTP — ngay cả khi đọc các tiêu đề thô, mã trạng thái luôn xuất hiện trước. Có thể hữu ích khi lưu trữ mã trạng thái trong một biến riêng biệt
$status_message = array_shift[$http_response_header];
Hàm array_shift phục vụ hai mục đích ở đây
- Nó trả về phần tử đầu tiên trong mảng
- Nó loại bỏ phần tử đầu tiên khỏi mảng
Tất cả các khóa dãy số cũng sẽ được cập nhật tương ứng, vì vậy sẽ không có bất kỳ khóa nào bị thiếu
Các tiêu đề HTTP được tạo bởi khóa. cặp giá trị, nhưng chúng ta không thể chuyển đổi chúng thành một mảng bằng dấu hai chấm [. ], vì các giá trị tiêu đề cũng có thể chứa dấu hai chấm. Vì vậy, những gì chúng ta có thể làm, mà không cần dùng đến biểu thức chính quy, là tách chuỗi theo dấu hai chấm đầu tiên trong chuỗi, vì dấu hai chấm luôn xuất hiện sau tên khóa
Ghi chú. Mặc dù sử dụng biểu thức chính quy sẽ dễ dàng hơn, nhưng sẽ nhanh hơn khoảng 10% đến 68% nếu sử dụng kết hợp giữa sọc và chất nền hoặc phát nổ - điều đó không quan trọng lắm trong thực tế - tuy nhiên, tôi nghĩ chúng ta nên tuân theo những gì
Tất cả các cách tiếp cận sau đây thực sự khá dễ sử dụng, vì vậy nên sử dụng cách nào có lẽ nên tùy theo cách nào hiệu quả nhất
Giải pháp 1
Sử dụng chức năng phát nổ nhanh hơn khoảng 68% so với sử dụng preg_match
$headers = array[]; $status_message = array_shift[$http_response_header]; foreach [$http_response_header as $value] { if[false !== [$matches = explode[':', $value, 2]]] { $headers["{$matches[0]}"] = trim[$matches[1]]; } }
Giải pháp 2
Đây là cách sử dụng stripos và substr, nhanh hơn khoảng 10% so với sử dụng biểu thức chính quy
________số 8_______
Giải pháp 3
Nếu vì lý do nào đó bạn thích sử dụng cụm từ thông dụng hơn, vui lòng làm như vậy; . Đây là cách sử dụng preg_match để làm điều tương tự
$headers = array[]; $status_message = array_shift[$http_response_header]; foreach [$http_response_header as $value] { if [preg_match['/^[[^:]+]:[[^\n]+]/', $value, $matches]] { $headers["{$matches[1]}"] = trim[$matches[2]]; } } print_r[$headers];
Tất nhiên chúng ta cũng có thể loại bỏ hàm trim khi sử dụng biểu thức chính quy;
Cách điểm chuẩn được thực hiện
Mỗi bài kiểm tra được thực hiện bằng cách phân tích cú pháp các tiêu đề 1 triệu lần như thế này
$start_time = microtime[true]; $repeat = 0; $status_message = array_shift[$http_response_header]; while [$repeat