Câu trả lời:
NẾU : bạn chỉ cần một tiêu đề duy nhất, thay vì tất cả các tiêu đề, phương pháp nhanh nhất là:
<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];
ELSE IF : bạn chạy PHP dưới dạng mô-đun Apache hoặc, kể từ PHP 5.4, sử dụng FastCGI (phương pháp đơn giản):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: Trong mọi trường hợp khác, bạn có thể sử dụng (triển khai userland):
<?php
function getRequestHeaders() {
$headers = array();
foreach($_SERVER as $key => $value) {
if (substr($key, 0, 5) <> 'HTTP_') {
continue;
}
$header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
$headers[$header] = $value;
}
return $headers;
}
$headers = getRequestHeaders();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
Xem thêm :
getallheaders () - (PHP> = 5.4) phiên bản đa nền tảng Bí danh của apache_request_headers()
apache_response_headers () - Lấy tất cả các tiêu đề phản hồi HTTP.
headftimelist () - Lấy danh sách các tiêu đề sẽ được gửi.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Các biến meta có tên bắt đầu bằng
HTTP_
chứa các giá trị được đọc từ các trường tiêu đề yêu cầu của máy khách, nếu giao thức được sử dụng là HTTP. Tên trường tiêu đề HTTP được chuyển đổi thành chữ hoa, có tất cả các lần xuất hiện được-
thay thế bằng_
và đãHTTP_
dự kiến đặt tên biến meta.
$_SERVER
biến không? Tài liệu PHP tại php.net/manual/en/reserved.variabled.server.php lảng tránh những gì chúng ta có thể chắc chắn sẽ có trong đó.
cache-control
tiêu đề, nhưng tôi không thấy nó ở đâu cả $_SERVER
. Tôi thấy một số tiêu đề có tiền tố HTTP_
, bao gồm "HTTP_ACCEPT" và "HTTP_UPGRADE_INSECURE_REQUESTS" và "HTTP_USER_AGENT" (trong số nhiều tiêu đề khác). Nhưng không có gì cho "kiểm soát bộ đệm" cũng không có gì cho "pragma". Điều này là bất kể trường hợp hoặc HTTP_
tiền tố. Tui bỏ lỡ điều gì vậy?
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Bạn sẽ tìm thấy tất cả các tiêu đề HTTP trong $_SERVER
biến toàn cục có tiền tố HTTP_
và dấu gạch ngang (-) được thay thế bằng dấu gạch dưới (_).
Ví dụ, bạn X-Requested-With
có thể tìm thấy trong:
$_SERVER['HTTP_X_REQUESTED_WITH']
Có thể thuận tiện để tạo một mảng kết hợp từ $_SERVER
biến. Điều này có thể được thực hiện theo một số kiểu, nhưng đây là một chức năng tạo ra các khóa được gắn vào:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
Bây giờ chỉ cần sử dụng $headers['XRequestedWith']
để lấy tiêu đề mong muốn.
Hướng dẫn sử dụng PHP trên $_SERVER
: http://php.net/manual/en/reserved.variabled.server.php
parseRequestHeaders()
hàm. Nếu cần một mảng kết hợp như vậy, thì IMO, hàm apache là tùy chọn tốt nhất, vì nó trả về chính xác các tiêu đề nhận được thay vì phiên bản CamelCase bị xáo trộn. (Cũng lưu ý rằng kể từ phiên bản PHP 5.4, nó không còn chỉ có Apache.)
apache_request_headers()
hoặc getallheaders()
dường như không viết hoa tên Header khi tôi thử nghiệm. Họ đang trở lại chính xác khi tôi chuyển từ phía khách hàng. Vậy thì tại sao bạn lại viết hoa tên tiêu đề trong một chức năng thay thế như vậy?
Vì PHP 5.4.0, bạn có thể sử dụng getallheaders
hàm trả về tất cả các tiêu đề yêu cầu dưới dạng một mảng kết hợp:
var_dump(getallheaders());
// array(8) {
// ["Accept"]=>
// string(63) "text/html[...]"
// ["Accept-Charset"]=>
// string(31) "ISSO-8859-1[...]"
// ["Accept-Encoding"]=>
// string(17) "gzip,deflate,sdch"
// ["Accept-Language"]=>
// string(14) "en-US,en;q=0.8"
// ["Cache-Control"]=>
// string(9) "max-age=0"
// ["Connection"]=>
// string(10) "keep-alive"
// ["Host"]=>
// string(9) "localhost"
// ["User-Agent"]=>
// string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) [...]"
// }
Trước đó, hàm này chỉ hoạt động khi PHP đang chạy như một mô-đun Apache / NSAPI.
strtolower
thiếu một số giải pháp được đề xuất, RFC2616 (HTTP / 1.1) định nghĩa các trường tiêu đề là các thực thể không phân biệt chữ hoa chữ thường. Toàn bộ, không chỉ là phần giá trị .
Vì vậy, các đề xuất như chỉ phân tích các mục HTTP_ là sai.
Tốt hơn sẽ là như thế này:
if (!function_exists('getallheaders')) {
foreach ($_SERVER as $name => $value) {
/* RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. */
if (strtolower(substr($name, 0, 5)) == 'http_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
$this->request_headers = $headers;
} else {
$this->request_headers = getallheaders();
}
Lưu ý sự khác biệt tinh tế với các đề xuất trước đó. Hàm ở đây cũng hoạt động trên php-fpm (+ nginx).
Date
tiêu đề - và rằng "Giá trị tham số [văn bản trong Kiểu nội dung sau dấu chấm phẩy] có thể hoặc không phân biệt chữ hoa chữ thường". Vì vậy, có ít nhất hai tiêu đề có giá trị phân biệt chữ hoa chữ thường, có vẻ như bạn đã sai.
HTTP header fields, which include general-header (section 4.5), request-header (section 5.3), response-header (section 6.2), and entity-header (section 7.1) fields, follow the same generic format as that given in Section 3.1 of RFC 822 [9]. Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive.
Vì vậy, tôi đoán bạn đã sai.
Truyền tên tiêu đề cho hàm này để lấy giá trị của nó mà không cần sử dụng for
vòng lặp. Trả về null nếu không tìm thấy tiêu đề.
/**
* @var string $headerName case insensitive header name
*
* @return string|null header value or null if not found
*/
function get_header($headerName)
{
$headers = getallheaders();
return isset($headerName) ? $headers[$headerName] : null;
}
Lưu ý: điều này chỉ hoạt động với máy chủ Apache, xem: http://php.net/manual/en/feft.getallheaders.php
Lưu ý: chức năng này sẽ xử lý và tải tất cả các tiêu đề vào bộ nhớ và nó ít hiệu suất hơn một for
vòng lặp.
Để làm cho mọi thứ đơn giản, đây là cách bạn có thể nhận được thứ bạn muốn:
Đơn giản:
$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];
hoặc khi bạn cần lấy một lúc:
<?php
/**
* @param $pHeaderKey
* @return mixed
*/
function get_header( $pHeaderKey )
{
// Expanded for clarity.
$headerKey = str_replace('-', '_', $pHeaderKey);
$headerKey = strtoupper($headerKey);
$headerValue = NULL;
// Uncomment the if when you do not want to throw an undefined index error.
// I leave it out because I like my app to tell me when it can't find something I expect.
//if ( array_key_exists($headerKey, $_SERVER) ) {
$headerValue = $_SERVER[ $headerKey ];
//}
return $headerValue;
}
// X-Requested-With mainly used to identify Ajax requests. Most JavaScript frameworks
// send this header with value of XMLHttpRequest, so this will not always be present.
$header_x_requested_with = get_header( 'X-Requested-With' );
Các tiêu đề khác cũng nằm trong mảng siêu toàn cầu $ _SERVER, bạn có thể đọc về cách truy cập chúng tại đây: http://php.net/manual/en/reserved.variabled.server.php
HTTP_
phù hợp với$headerKey
Tôi đã sử dụng CodeIgniter và sử dụng mã dưới đây để lấy nó. Có thể hữu ích cho ai đó trong tương lai.
$this->input->get_request_header('X-Requested-With');
Đây là cách tôi đang làm. Bạn cần nhận được tất cả các tiêu đề nếu $ header_name không được thông qua:
<?php
function getHeaders($header_name=null)
{
$keys=array_keys($_SERVER);
if(is_null($header_name)) {
$headers=preg_grep("/^HTTP_(.*)/si", $keys);
} else {
$header_name_safe=str_replace("-", "_", strtoupper(preg_quote($header_name)));
$headers=preg_grep("/^HTTP_${header_name_safe}$/si", $keys);
}
foreach($headers as $header) {
if(is_null($header_name)){
$headervals[substr($header, 5)]=$_SERVER[$header];
} else {
return $_SERVER[$header];
}
}
return $headervals;
}
print_r(getHeaders());
echo "\n\n".getHeaders("Accept-Language");
?>
Nó trông đơn giản hơn nhiều so với hầu hết các ví dụ được đưa ra trong các câu trả lời khác. Điều này cũng nhận được phương thức (GET / POST / v.v.) và URI được yêu cầu khi nhận tất cả các tiêu đề có thể hữu ích nếu bạn đang cố gắng sử dụng nó trong đăng nhập.
Đây là đầu ra:
Array ( [HOST] => 127.0.0.1 [USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0 [ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [ACCEPT_LANGUAGE] => en-US,en;q=0.5 [ACCEPT_ENCODING] => gzip, deflate [COOKIE] => PHPSESSID=MySessionCookieHere [CONNECTION] => keep-alive )
en-US,en;q=0.5
Đây là một cách dễ dàng để làm điều đó.
// echo get_header('X-Requested-With');
function get_header($field) {
$headers = headers_list();
foreach ($headers as $header) {
list($key, $value) = preg_split('/:\s*/', $header);
if ($key == $field)
return $value;
}
}
nếu chỉ cần một khóa để truy xuất, ví dụ "Host"
địa chỉ được yêu cầu, thì chúng ta có thể sử dụng
apache_request_headers()['Host']
Vì vậy, chúng ta có thể tránh các vòng lặp và đặt nó trực tiếp vào đầu ra echo
Công việc này nếu bạn có máy chủ Apache
Mã PHP:
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
Kết quả:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive