Вызов функции undefined apache_request_headers()
Я только что переключил свои скрипты на другой сервер. На предыдущем сервере это работало безупречно, и теперь, когда я переключил их на другой сервер, я не могу понять проблему.
Я не уверен, что это поможет, но здесь соответствующий код.
$headers = apache_request_headers();
Версия PHP: PHP 5.3.2
Ответы
Ответ 1
Из docs перед выпуском PHP 5.4.0:
Эта функция поддерживается только в том случае, если PHP установлен как модуль Apache.
PHP 5.4.0 и более поздние версии поддерживают эту функцию безоговорочно.
Указанные документы также включают функции замещения, которые имитируют функциональные возможности apache_request_headers
, путем перехода через $_SERVER
.
Ответ 2
Вы можете использовать следующую функцию замены:
<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach($_SERVER as $key => $val) {
if( preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// do some nasty string manipulations to restore the original letter case
// this should work in most cases
$rx_matches = explode('_', $arh_key);
if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return( $arh );
}
///
}
///
?>
Источник: Руководство по PHP
Ответ 3
если php установлен как модуль Apache:
apache_request_headers()["Authorization"];
else, перейдите в файл .htaccess и добавьте:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
Затем вы можете получить доступ к заголовкам запроса, используя любой из них:
$_SERVER["HTTP_AUTHORIZATION"]; // using super global
ИЛИ
$app->request->headers("Authorization"); // if using PHP Slim
Ответ 4
Как было предложено в другом ответе здесь, я использовал функцию из комментариев в Документации PHP, но обнаружил, что он субоптимальный, трудно читаемый/поддерживаемый и не полный по сравнению с (несоответствующим) корпусом некоторых заголовков.
Итак, потому что мне действительно нужно было полагаться на него, я переписал его, чтобы быть более очевидным, а также лучше обработать более краткие случаи - исходный код даже утверждает: "Сделайте некоторые неприятные манипуляции с строками, чтобы восстановить исходный буквенный регистр" и "это должно работать в большинстве случаев", что не очень приятно для чего-то, от чего вы должны быть в состоянии зависеть.
Это не идеально, но я считаю, что он более надежный. Единственное, чего ему не хватает - это работать с фактическими или оригинальными заголовками, так как любые изменения в $_SERVER
будут отражены в выходе. Это можно смягчить, сделав результат статическим и запустив функцию в первую очередь для каждого запроса.
<?php
// Drop-in replacement for apache_request_headers() when it not available
if(!function_exists('apache_request_headers')) {
function apache_request_headers() {
// Based on: http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
$arrCasedHeaders = array(
// HTTP
'Dasl' => 'DASL',
'Dav' => 'DAV',
'Etag' => 'ETag',
'Mime-Version' => 'MIME-Version',
'Slug' => 'SLUG',
'Te' => 'TE',
'Www-Authenticate' => 'WWW-Authenticate',
// MIME
'Content-Md5' => 'Content-MD5',
'Content-Id' => 'Content-ID',
'Content-Features' => 'Content-features',
);
$arrHttpHeaders = array();
foreach($_SERVER as $strKey => $mixValue) {
if('HTTP_' !== substr($strKey, 0, 5)) {
continue;
}
$strHeaderKey = strtolower(substr($strKey, 5));
if(0 < substr_count($strHeaderKey, '_')) {
$arrHeaderKey = explode('_', $strHeaderKey);
$arrHeaderKey = array_map('ucfirst', $arrHeaderKey);
$strHeaderKey = implode('-', $arrHeaderKey);
}
else {
$strHeaderKey = ucfirst($strHeaderKey);
}
if(array_key_exists($strHeaderKey, $arrCasedHeaders)) {
$strHeaderKey = $arrCasedHeaders[$strHeaderKey];
}
$arrHttpHeaders[$strHeaderKey] = $mixValue;
}
return $arrHttpHeaders;
}
}
Ответ 5
То же самое случилось со мной при использовании "apache_request_headers()", поэтому я использовал этот код - отлично работает для вывода всех заголовков:
<?php
$headers = array();
foreach($_SERVER as $key => $value) {
if(strpos($key, 'HTTP_') === 0) {
$headers = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5)))));
echo $headers." : ". $i[$headers] = $value . "<br>";
}
}
?>
Пример вывода :
Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding : gzip, deflate
Accept-Language : en-US,en;q=0.5
Cache-Control : max-age=0
Connection : keep-alive
Host : example.com
Referer : https://example.com/
User-Agent : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Ответ 6
Pleae использует follownig methord для получения заголовков с использованием PHP в Nginx
function getHeaders()
{
$headers = array();
foreach ($_SERVER as $k => $v)
{
if (substr($k, 0, 5) == "HTTP_")
{
$k = str_replace('_', ' ', substr($k, 5));
$k = str_replace(' ', '-', ucwords(strtolower($k)));
$headers[$k] = $v;
}
}
return $headers;
}
Источник с этой страницы