Я только что переключил свои сценарии на другой сервер. На предыдущем сервере это работало безупречно, и теперь, когда я переключил их на другой сервер, я не могу понять проблему.
Я не уверен, что это поможет, но вот соответствующий код.
$headers = apache_request_headers();
Версия PHP: PHP 5.3.2
Любая помощь будет оценена по достоинству.
Из документов перед выпуском PHP 5.4.0:
Эта функция поддерживается только в том случае, если PHP установлен как модуль Apache.
PHP 5.4.0 и более поздние версии поддерживают эту функцию безоговорочно.
Указанные документы также включают функции замещения, которые имитируют функциональность apache_request_headers
путем apache_request_headers
через $_SERVER
.
Вы можете использовать следующую функцию замены:
<?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
если 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
То же самое случилось со мной при использовании «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
Как было предложено в другом ответе здесь , я использовал функцию из комментариев в документации PHP , но обнаружил, что она субоптимальная, трудно читаемая / поддерживаемая и не полная по сравнению с (несоответствующей) оболочкой некоторых заголовков.
Поэтому, поскольку мне действительно нужно было полагаться на него, я переписал его, чтобы быть более очевидным, и лучше обрабатывать более краткие случаи – исходный код даже утверждает: «Сделайте некоторые неприятные манипуляции с строками, чтобы восстановить исходный регистр букв» и « это должно работать в большинстве случаев » , что не очень приятно для чего-то, от чего вы должны зависеть.
Это не идеально, но я считаю, что он более надежный. Единственное, чего ему не хватает, – это работать с фактическими или оригинальными заголовками, так как любые изменения в $_SERVER
будут отражены в выходе. Это можно смягчить, сделав результат статическим и запустив функцию в первую очередь при каждом запросе.
<?php // Drop-in replacement for apache_request_headers() when it's 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; } }