Est-il possible d'obtenir les en-têtes http de la requête en cours avec PHP? Je n'utilise pas en utilisant Apache comme serveur Web, mais en utilisant nginx.
J'ai essayé d'utiliser getallheaders()
mais j'obtiens Call to undefined function getallheaders()
.
Tiré de la documentation, quelqu'un a écrit un commentaire ...
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 a amélioré sa fonction, ce qui le rend un peu plus sûr:
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;
}
}
(J'aurais bien voulu ajouter ceci comme commentaire à sa réponse, tout en continuant à me baser sur cette réputation, l'une de mes premières réponses)
Combiné getallheaders () + Apache_request_headers () pour nginx
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;
}
Vous pouvez mettre à niveau votre serveur vers PHP 5.4, vous donnant ainsi accès à getallheaders () via fastcgi ou tout simplement analyser ce dont vous avez besoin dans $ _SERVER avec une boucle foreach
et une petite regex.
Ce problème a finalement été résolu dans PHP 7.3.0, vérifiez notes de publication .
Correction d'un bug # 62596 (getallheaders () manquant avec PHP-FPM).
Cela devrait fonctionner:
<?php
print_r(
array_intersect_key(
$_SERVER,
array_flip(
preg_grep(
'/^HTTP_/',
array_keys($_SERVER),
0
)
)
)
);