Jawaban:
JIKA : Anda hanya perlu satu tajuk, alih-alih semua tajuk, metode tercepat adalah:
<?php
// Replace XXXXXX_XXXX with the name of the header you need in UPPERCASE (and with '-' replaced by '_')
$headerStringValue = $_SERVER['HTTP_XXXXXX_XXXX'];
LAIN JIKA : Anda menjalankan PHP sebagai modul Apache atau, pada PHP 5.4, menggunakan FastCGI (metode sederhana):
<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
ELSE: Dalam hal lain, Anda dapat menggunakan (implementasi 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";
}
Lihat Juga :
getallheaders () - (PHP> = 5.4) edisi lintas platform Alias of apache_request_headers()
apache_response_headers () - Ambil semua header respons HTTP.
headers_list () - Ambil daftar header yang akan dikirim.
$_SERVER['HTTP_X_REQUESTED_WITH']
RFC3875 , 4.1.18:
Meta-variabel dengan nama yang diawali dengan
HTTP_
berisi nilai yang dibaca dari bidang header permintaan klien, jika protokol yang digunakan adalah HTTP. Nama bidang tajuk HTTP dikonversi ke huruf besar, memiliki semua kemunculan-
diganti dengan_
dan telahHTTP_
ditambahkan untuk memberikan nama meta-variabel.
$_SERVER
variabel? Dokumentasi PHP di php.net/manual/en/reserved.variables.server.php mengelak tentang apa yang bisa kita yakini ada di sana.
cache-control
tajuk, tapi saya tidak melihatnya di mana pun di $_SERVER
. Saya memang melihat beberapa tajuk diawali dengan HTTP_
, termasuk "HTTP_ACCEPT", dan "HTTP_UPGRADE_INSECURE_REQUESTS" dan "HTTP_USER_AGENT" (di antara beberapa lainnya). Tapi tidak ada untuk "kontrol cache" juga tidak ada untuk "pragma". Ini terlepas dari kasus atau HTTP_
awalan. Apakah saya melewatkan sesuatu?
_SERVER["HTTP_CACHE_CONTROL"] max-age=0
Anda harus menemukan semua header HTTP di $_SERVER
variabel global yang diawali dengan HTTP_
huruf besar dan dengan tanda hubung (-) diganti dengan garis bawah (_).
Misalnya Anda X-Requested-With
dapat ditemukan di:
$_SERVER['HTTP_X_REQUESTED_WITH']
Mungkin nyaman untuk membuat array asosiatif dari $_SERVER
variabel. Ini bisa dilakukan dalam beberapa gaya, tapi di sini ada fungsi yang mengeluarkan kunci camelcased:
$headers = array();
foreach ($_SERVER as $key => $value) {
if (strpos($key, 'HTTP_') === 0) {
$headers[str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))))] = $value;
}
}
Sekarang cukup gunakan $headers['XRequestedWith']
untuk mengambil header yang diinginkan.
Manual PHP di $_SERVER
: http://php.net/manual/en/reserved.variables.server.php
parseRequestHeaders()
fungsi. Jika array asosiatif seperti itu diperlukan, maka IMO fungsi apache adalah opsi terbaik, karena mengembalikan persis header yang diterima daripada versi CamelCase yang rusak. (Juga perhatikan bahwa pada PHP 5.4, tidak lagi hanya Apache.)
apache_request_headers()
atau getallheaders()
sepertinya tidak menggunakan nama judul saat saya menguji. Mereka kembali tepat ketika saya lulus dari sisi klien. Lalu mengapa Anda menggunakan nama judul dalam fungsi penggantian seperti itu?
Karena PHP 5.4.0 Anda dapat menggunakan getallheaders
fungsi yang mengembalikan semua header permintaan sebagai array asosiatif:
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) [...]"
// }
Sebelumnya fungsi ini hanya berfungsi ketika PHP dijalankan sebagai modul Apache / NSAPI.
strtolower
kurang dalam beberapa solusi yang diusulkan, RFC2616 (HTTP / 1.1) mendefinisikan bidang header sebagai entitas case-insensitive. Semuanya, bukan hanya bagian nilai .
Jadi saran seperti hanya mem- parsing entri HTTP_ salah.
Lebih baik seperti ini:
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();
}
Perhatikan perbedaan halus dengan saran sebelumnya. Fungsi di sini juga berfungsi di php-fpm (+ nginx).
Date
header - dan bahwa "Nilai parameter [teks dalam Content-Type setelah titik koma] mungkin atau mungkin tidak peka huruf besar-kecil". Jadi mengingat setidaknya ada dua header dengan nilai case-sensitive, sepertinya Anda salah.
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.
Jadi saya kira Anda salah.
Berikan nama tajuk ke fungsi ini untuk mendapatkan nilainya tanpa menggunakan for
lingkaran. Mengembalikan nol jika tajuk tidak ditemukan.
/**
* @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;
}
Catatan: ini hanya berfungsi dengan server Apache, lihat: http://php.net/manual/en/function.getallheaders.php
Catatan: fungsi ini akan memproses dan memuat semua header ke memori dan itu kurang berkinerja daripada for
loop.
Untuk mempermudah, berikut ini cara mendapatkan yang Anda inginkan:
Sederhana:
$headerValue = $_SERVER['HTTP_X_REQUESTED_WITH'];
atau ketika Anda perlu mendapatkannya satu per satu:
<?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' );
Header lain juga ada dalam array super global $ _SERVER, Anda dapat membaca tentang cara mendapatkannya di sini: http://php.net/manual/en/reserved.variables.server.php
HTTP_
$headerKey
Saya menggunakan CodeIgniter dan menggunakan kode di bawah ini untuk mendapatkannya. Semoga bermanfaat bagi seseorang di masa depan.
$this->input->get_request_header('X-Requested-With');
Begini cara saya melakukannya. Anda harus mendapatkan semua tajuk jika $ header_name tidak lulus:
<?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");
?>
Bagiku itu terlihat jauh lebih sederhana daripada sebagian besar contoh yang diberikan dalam jawaban lain. Ini juga mendapatkan metode (GET / POST / dll.) Dan URI diminta ketika mendapatkan semua header yang dapat berguna jika Anda mencoba menggunakannya dalam log.
Inilah hasilnya:
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
Ini cara mudah untuk melakukannya.
// 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;
}
}
Cuplikan PHP kecil ini dapat membantu Anda:
<?php
foreach($_SERVER as $key => $value){
echo '$_SERVER["'.$key.'"] = '.$value."<br />";
}
?>
function getCustomHeaders()
{
$headers = array();
foreach($_SERVER as $key => $value)
{
if(preg_match("/^HTTP_X_/", $key))
$headers[$key] = $value;
}
return $headers;
}
Saya menggunakan fungsi ini untuk mendapatkan header kustom, jika header dimulai dari "HTTP_X_" kami mendorong dalam array :)
jika hanya satu kunci yang diperlukan untuk diambil, Misalnya "Host"
alamat diperlukan, maka kita dapat menggunakan
apache_request_headers()['Host']
Sehingga kita dapat menghindari loop dan meletakkannya sejajar dengan output echo
Ini berfungsi jika Anda memiliki server Apache
Kode PHP:
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
echo "$header: $value <br />\n";
}
Hasil:
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: www.example.com
Connection: Keep-Alive