web-dev-qa-db-fra.com

Comment imprimer toutes les informations d'une requête HTTP à l'écran, en PHP

J'ai besoin d'un code PHP qui effectue un vidage de toutes les informations dans une demande HTTP, y compris les en-têtes et le contenu de toute information incluse dans une demande POST. Fondamentalement, un outil de diagnostic qui crache exactement ce que j'envoie à un serveur.

Quelqu'un at-il un code qui fait cela?

48
Spike Williams

Enfin:

print_r($_REQUEST);

Cela couvre la plupart des éléments entrants: PHP.net Manual: $ _REQUEST

44
Marco Ceppi

Un moyen simple serait:

<?php
print_r($_SERVER);
print_r($_POST);
print_r($_GET);
print_r($_FILES);
?>

Un peu de massage serait nécessaire pour obtenir tout dans l'ordre souhaité et pour exclure les variables qui ne vous intéressent pas, mais cela devrait vous donner un début.

27
Vinko Vrsalovic

Eh bien, vous pouvez lire l'intégralité du corps POST comme ça

echo file_get_contents( 'php://input' );

Et, en supposant que votre serveur Web est Apache, vous pouvez lire les en-têtes de demande comme ça

$requestHeaders = Apache_request_headers();
23
Peter Bailey

Personne n'a mentionné comment vider correctement les en-têtes HTTP en toutes circonstances.

D'après la spécification CGI rfc3875, section 4.1.18:

Les méta-variables dont le nom commence par "HTTP_" contiennent des valeurs lues dans les champs d'en-tête de demande client, si le protocole utilisé est HTTP. Le nom du champ d'en-tête HTTP est converti en majuscules, a toutes les occurrences de "-" remplacé par "" et a "HTTP " ajouté pour donner la méta -Nom de variable.

foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        $chunks = explode('_', $key);
        $header = '';
        for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) {
            $header .= ucfirst(strtolower($chunks[$i])).'-';
        }
        $header .= ucfirst(strtolower($chunks[$i])).': '.$value;
        echo $header.'<br>';
    }
}

Détails: http://cmyker.blogspot.com/2012/10/how-to-dump-http-headers-with-php.html

11
Cmyker

En rassemblant les réponses de Peter Bailey et Cmyker vous obtenez quelque chose comme:

<?php
foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0) {
        $chunks = explode('_', $key);
        $header = '';
        for ($i = 1; $y = sizeof($chunks) - 1, $i < $y; $i++) {
            $header .= ucfirst(strtolower($chunks[$i])).'-';
        }
        $header .= ucfirst(strtolower($chunks[$i])).': '.$value;
        echo $header."\n";
    }
}
$body = file_get_contents('php://input');
if ($body != '') {
  print("\n$body\n\n");
}
?>

qui fonctionne avec le php -S serveur Web intégré, qui est une fonctionnalité très pratique de PHP.

5
ldav1s

Si vous voulez des en-têtes HTTP réels (à la fois la demande et la réponse), essayez hurl.it .

Vous pouvez utiliser la commande PHP Apache_request_headers() pour obtenir les en-têtes de demande et Apache_response_headers() pour obtenir les en-têtes de réponse actuels. Notez que la réponse peut être modifiée ultérieurement dans le script PHP tant que le contenu n'a pas été servi.

3
matpie

file_get_contents ('php: // input') ne fonctionnera pas toujours.

J'ai une demande avec dans les en-têtes "content-length = 735" et "php: // input" est une chaîne vide. Cela dépend donc de la qualité/validité de la requête HTTP.

1
Roger Getnoticed

Le problème était, dans l'URL que j'ai écrit http: // mon_domaine au lieu de https: // mon_domaine

0
yassine j

en outre, vous pouvez utiliser get_headers () . cela ne dépend pas d'Apache ..

print_r(get_headers());
0
Sergey Eremin