PHPで現在のリクエストのhttpヘッダーを取得することは可能ですか?私はnot WebサーバーとしてApacheを使用していますが、nginxを使用しています。
getallheaders()
を使用してみましたが、Call to undefined function getallheaders()
を取得しています。
誰かが書いたドキュメンテーションから comment ...
if (!function_exists('getallheaders'))
{
function getallheaders()
{
$headers = array ();
foreach ($_SERVER as $name => $value)
{
if (substr($name, 0, 5) == 'HTTP_')
{
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
@Laykeの機能を改善し、使用が少し安全になりました。
if (!function_exists('getallheaders')) {
function getallheaders()
{
if (!is_array($_SERVER)) {
return array();
}
$headers = array();
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
(彼の答えにコメントとしてこれを追加することができればいいのに、それでもその評判に基づいて構築することを望んでいた-私の最初の返信の1つ)
nginx用のgetallheaders()+ Apache_request_headers()の組み合わせ
function get_nginx_headers($function_name='getallheaders'){
$all_headers=array();
if(function_exists($function_name)){
$all_headers=$function_name();
}
else{
foreach($_SERVER as $name => $value){
if(substr($name,0,5)=='HTTP_'){
$name=substr($name,5);
$name=str_replace('_',' ',$name);
$name=strtolower($name);
$name=ucwords($name);
$name=str_replace(' ', '-', $name);
$all_headers[$name] = $value;
}
elseif($function_name=='Apache_request_headers'){
$all_headers[$name] = $value;
}
}
}
return $all_headers;
}
サーバーをPHP 5.4にアップグレードして、fastcgi経由で getallheaders() にアクセスするか、foreach
ループと少し正規表現。
この問題は、最終的にPHP 7.3.0、check release notes で対処されました。
バグを修正 #62596 (getallheaders()がPHP-FPMにない)。
これは動作するはずです:
<?php
print_r(
array_intersect_key(
$_SERVER,
array_flip(
preg_grep(
'/^HTTP_/',
array_keys($_SERVER),
0
)
)
)
);