Maison  >  Article  >  interface Web  >  Comprendre tous les aspects des en-têtes HTTP Description d'images et de textes_HTML/Xhtml_Production de pages Web

Comprendre tous les aspects des en-têtes HTTP Description d'images et de textes_HTML/Xhtml_Production de pages Web

WBOY
WBOYoriginal
2016-05-16 16:41:482869parcourir

Que sont les en-têtes HTTP

HTTP est écrit par le « Hypertext Transfer Protocol ». Ce protocole est utilisé par l'ensemble du World Wide Web. Presque la plupart du contenu que vous voyez dans le navigateur est transmis via le protocole http, comme cet article.

Les en-têtes HTTP sont au cœur des requêtes et des réponses HTTP. Ils contiennent des informations sur le navigateur client, la page demandée, le serveur, etc.

Exemple

Lorsque vous tapez une URL dans la barre d'adresse du navigateur, votre navigateur fera une requête http similaire à la suivante :
GET /tutorials/other/top-20-mysql-best- practices / HTTP/1.1<code>GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1<br>Host: net.tutsplus.com<br>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)<br>Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8<br>Accept-Language: en-us,en;q=0.5<br>Accept-Encoding: gzip,deflate<br>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br>Keep-Alive: 300<br>Connection: keep-alive<br>Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120<br>Pragma: no-cache<br>Cache-Control: no-cache<br>Hôte : net.tutsplus.com
Agent utilisateur : Mozilla/5.0 (Windows ; U ; Windows NT 6.1 ; en-US ; rv :1.9.1.5) Gecko/20091102 Firefox/3.5 . 5 (.NET CLR 3.5.30729)
Accepter : text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8

Accepter-Langue : en-us, en ;q=0.5

Accepter-Encoding : gzip,deflate

Accepter-Charset : ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive : 300<font face="NSimsun">HTTP/1.x 200 OK<br>Transfer-Encoding: chunked<br>Date: Sat, 28 Nov 2009 04:36:25 GMT<br>Server: LiteSpeed<br>Connection: close<br>X-Powered-By: W3 Total Cache/0.8<br>Pragma: public<br>Expires: Sat, 28 Nov 2009 05:36:25 GMT<br>Etag: "pub1259380237;gz"<br>Cache-Control: max-age=3600, public<br>Content-Type: text/html; charset=UTF-8<br>Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT<br>X-Pingback: http://net.tutsplus.com/xmlrpc.php<br>Content-Encoding: gzip<br>Vary: Accept-Encoding, Cookie, User-Agent<br><!-- ... rest of the html ... --></font>Connexion : keep-alive

Cookie : PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120

Pragma : no-cache

Cache-Control : no-cache

La première ligne est appelée "Ligne de demande" décrit les informations de base de la demande, le reste étant constitué d'en-têtes HTTP.

Une fois la demande terminée, votre navigateur peut recevoir la réponse HTTP suivante :

HTTP/1.x 200 OK

Transfer-Encoding : chunked

Date : samedi 28 novembre 2009 04:36:25 GMT

Serveur : LiteSpeedConnexion : closeX-Powered-By : W3 Total Cache/0.8Pragma : publicExpire : samedi 28 novembre 2009 05:36:25 GMT

Etag : "pub1259380237;gz"

Cache-Control : max-age=3600, publicContent-Type : text/html; charset=UTF-8Dernière modification : samedi 28 novembre 2009 03:50:37 GMTX -Ping : http://net.tutsplus.com/xmlrpc.php

Content-Encoding : gzip

Vary : Accept-Encoding, Cookie, User-Agent La première ligne s'appelle "Status Line", et après elle se trouvent les en-têtes http. Après la ligne vide, le contenu commence à être affiché (dans ce cas, une sortie HTML).

Mais lorsque vous affichez le code source de la page, vous ne pouvez pas voir les en-têtes HTTP, bien qu'ils soient envoyés au navigateur avec ce que vous pouvez voir. Cette requête HTTP envoie également des requêtes pour recevoir d'autres ressources, telles que des images, des fichiers CSS, des fichiers js, etc.

Jetons un coup d’œil aux détails.

Comment voir les en-têtes HTTP
  • Les extensions FireFox suivantes peuvent vous aider à analyser les en-têtes HTTP : 1. firebug

2.

En-têtes HTTP en direct

3. En PHP : getallheaders() est utilisé pour obtenir les en-têtes de requête. Vous pouvez également utiliser le tableau $_SERVER . headers_list() est utilisé pour obtenir les en-têtes de réponse. Au bas de l'article, vous verrez quelques exemples d'utilisation de PHP. Structure de la requête HTTP La première ligne, appelée « première ligne », contient trois parties :
  • "méthode" indique de quel type de requête il s'agit. Les types de requêtes les plus courants sont GET, POST et HEAD
  • .
  • "path" reflète le chemin après l'hôte. Par exemple, lorsque vous demandez "http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/", le chemin sera " /tutoriels/autres/top-20-mysql-best-practices/".
  • « protocole » contient « HTTP » et le numéro de version, les navigateurs modernes utiliseront 1.1.

Chaque ligne restante est une paire "Nom:Valeur". Ils contiennent diverses informations sur la demande et votre navigateur. Par exemple, « User-Agent » indique la version de votre navigateur et le système d'exploitation que vous utilisez. "Accept-Encoding" indique au serveur que votre navigateur peut accepter une sortie compressée comme gzip.

La plupart de ces en-têtes sont facultatifs. Les requêtes HTTP peuvent même être rationalisées pour ressembler à ceci :

<font face="NSimsun">GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1<br>Host: net.tutsplus.com</font>

Et vous recevrez toujours une réponse valide du serveur.

Type de demande

Les trois types de requêtes les plus courants sont : GET, POST et HEAD Vous connaissez peut-être les deux premiers grâce au processus d'écriture HTML.

OBTENIR : Obtenez un document

La plupart des fichiers html, images, js, css, ... qui sont transmis au navigateur sont demandés via la méthode GET. C'est la principale méthode d'obtention de données.

Par exemple, pour obtenir des articles Nettuts, la première ligne de la requête http ressemble généralement à ceci :

<font face="NSimsun">GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1</font>

Une fois le code HTML chargé, le navigateur enverra une requête GET pour récupérer l'image, comme ceci :

<font face="NSimsun">GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1</font>

Le formulaire peut également être envoyé via la méthode GET. Voici un exemple :

<font face="NSimsun"><form action="foo.php" method="GET"> <br>First Name: <input name="first_name" type="text"><br>Last Name: <input name="last_name" type="text"><br><input name="action" type="submit" value="Submit"><br> </form></font>

Lorsque ce formulaire sera soumis, la requête HTTP ressemblera à ceci :

<font face="NSimsun">GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1<br>...</font>

Vous pouvez envoyer la saisie du formulaire au serveur en l'ajoutant à une chaîne de requête.

POST : Envoyer des données au serveur

Bien que vous puissiez ajouter des données à l'URL et les envoyer au serveur via la méthode GET, dans de nombreux cas, il est plus approprié d'utiliser POST pour envoyer des données au serveur. L'envoi de grandes quantités de données via GET est irréaliste et comporte certaines limites.

Il est courant d'envoyer des données de formulaire à l'aide de requêtes POST. Modifions l'exemple ci-dessus pour utiliser la méthode POST :

<font face="NSimsun"><form action="foo.php" method="POST"> <br>First Name: <input name="first_name" type="text"><br>Last Name: <input name="last_name" type="text"><br><input name="action" type="submit" value="Submit"><br> </form></font>

La soumission de ce formulaire créera une requête HTTP comme suit :

<font face="NSimsun">POST /foo.php HTTP/1.1<br>Host: localhost<br>User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)<br>Accept: text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8<br>Accept-Language: en-us,en;q=0.5<br>Accept-Encoding: gzip,deflate<br>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br>Keep-Alive: 300<br>Connection: keep-alive<br>Referer: http://localhost/test.php<br>Content-Type: application/x-www-form-urlencoded<br>Content-Length: 43<br>first_name=John&last_name=Doe&action=Submit</font>

Il y a trois choses à noter ici :

  • Le chemin de la première ligne a été modifié simplement /foo.php , sans la chaîne de requête.
  • Ajout des en-têtes Content-Type et Content-Lenght, qui fournissent des informations pertinentes pour l'envoi de messages
  • Toutes les données sont envoyées après les en-têtes sous forme de chaîne de requête.

La requête POST peut également être utilisée sur AJAX, application, cURL... Et tous les formulaires de téléchargement de fichiers doivent utiliser la méthode POST.

HEAD : recevoir des informations d'en-tête

HEAD est très similaire à GET, sauf que HEAD n'accepte pas la partie contenu de la réponse HTTP. Lorsque vous envoyez une requête HEAD, cela signifie que vous n'êtes intéressé que par les en-têtes HTTP, pas par le document lui-même.

Cette méthode permet au navigateur de déterminer si la page a été modifiée et ainsi de contrôler la mise en cache. Il peut également déterminer si le document demandé existe.

Par exemple, s'il y a de nombreux liens sur votre site Web, vous pouvez simplement leur envoyer des requêtes HEAD respectivement pour déterminer s'il y a des liens morts, ce qui est beaucoup plus rapide que d'utiliser GET.

Structure de réponse http

Lorsque le navigateur envoie une requête HTTP, le serveur répondra à la requête par une réponse HTTP. Si le contenu ne vous intéresse pas, la requête ressemblerait à ceci :

La première information précieuse est l'accord. Actuellement, les serveurs utiliseront HTTP/1.x ou HTTP/1.1.

Le message court suivant représente le statut. Le code 200 signifie que notre demande a été envoyée avec succès et que le serveur renverra le document que nous avons demandé, après les informations d'en-tête.

Nous avons tous vu la page « Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web ». Lorsque je demande un chemin inexistant au serveur, le serveur nous répond par Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web au lieu de 200.

Le reste du contenu de la réponse est similaire à la requête HTTP. Il s'agit du logiciel serveur, du moment où la page/le fichier a été modifié, du type MIME, etc...

Encore une fois, ces en-têtes sont facultatifs.

Code d'état HTTP

  • 200 est utilisé pour indiquer une demande réussie
  • 300 pour indiquer la redirection
  • 400 est utilisé pour indiquer un problème avec la demande
  • 500 est utilisé pour indiquer un problème avec le serveur.

200 Succès (OK)

Comme mentionné précédemment, 200 est utilisé pour indiquer que la demande a abouti.

206 Contenu partiel

Si une application demande uniquement des fichiers dans une certaine plage, 206 seront renvoyés.

Ceci est généralement utilisé pour la gestion des téléchargements, la reprise des téléchargements ou le téléchargement de fichiers en morceaux.

Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web introuvable

Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web

Facile à comprendre

Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web Non autorisé

Les pages protégées par mot de passe renverront ce statut. Si vous ne saisissez pas le bon mot de passe, vous verrez le message suivant dans votre navigateur :

Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web

Notez qu'il s'agit uniquement d'une page protégée par mot de passe. La boîte de dialogue demandant un mot de passe ressemble à ceci :

Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web_prompt

403 Interdit

Si vous n'avez pas l'autorisation d'accéder à une page, un statut 403 sera renvoyé. Cela se produit généralement lorsque vous essayez d'ouvrir un dossier qui ne possède pas de page d'index. Si les paramètres du serveur ne permettent pas d'afficher le contenu du répertoire, vous verrez une erreur 403.

D'autres méthodes enverront également des restrictions d'autorisation, par exemple vous pouvez bloquer par adresse IP, ce qui nécessite l'aide de htaccess.

<font face="NSimsun">order allow,deny<br>deny from 192.168.44.201<br>deny from 224.39.163.12<br>deny from 172.16.7.92<br>allow from all</font>

302 (ou 307) déplacés temporairement et 301 déplacés définitivement

Ces deux états apparaîtront lors de la redirection du navigateur. Par exemple, vous utilisez un service de raccourcissement d'URL comme bit.ly. C'est ainsi qu'ils apprennent qui a cliqué sur leurs liens.

302 et 301 sont très similaires pour les navigateurs, mais il existe quelques différences pour les robots des moteurs de recherche. Par exemple, si votre site Web est en maintenance, vous redirigerez le navigateur client vers une autre adresse avec un 302. Les robots des moteurs de recherche réindexeront votre page à l’avenir. Mais si vous utilisez une redirection 301, vous indiquez aux robots des moteurs de recherche que votre site Web a été définitivement déplacé vers une nouvelle adresse.

500 Erreur de serveur interne

Ce code apparaît généralement lorsque le script de la page plante. La plupart des scripts CGI n'envoient pas de messages d'erreur au navigateur comme le fait PHP. Si une erreur fatale se produit, ils envoient simplement un code d'état 500. À ce stade, vous devez consulter le journal des erreurs du serveur pour résoudre le problème.

Liste complète

Vous pouvez trouver la description complète des codes d'état HTTP ici .

Requête HTTP dans les en-têtes HTTP

Examinons maintenant quelques informations de requête HTTP courantes trouvées dans les en-têtes HTTP.

Toutes ces informations d’en-tête se trouvent dans le tableau $_SERVER de PHP. Vous pouvez également utiliser la fonction getallheaders() pour obtenir toutes les informations d'en-tête en même temps.

Hôte

Une requête HTTP sera envoyée à une adresse IP spécifique, mais la plupart des serveurs ont la capacité d'héberger plusieurs sites Web sous la même adresse IP, le serveur doit donc savoir quel nom de domaine le navigateur demande des ressources.

<font face="NSimsun">Hôte : rlog.cn<code><font face="NSimsun">Host: rlog.cn</font>

Il s'agit simplement du nom d'hôte de base, y compris le domaine et les sous-domaines.

En PHP, vous pouvez le visualiser via $_SERVER['HTTP_HOST'] ou $_SERVER['SERVER_NAME'].

Agent utilisateur

<font face="NSimsun">Agent utilisateur : Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (. NET CLR 3.5.30729)<code><font face="NSimsun">User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)</font>

Cet en-tête peut contenir les informations suivantes :

  • Nom du navigateur et numéro de version
  • Nom du système d'exploitation et numéro de version
  • Langue par défaut.

Il s'agit d'une méthode courante utilisée par certains sites Web pour collecter des informations sur les visiteurs. Par exemple, vous pouvez déterminer si un visiteur accède à votre site à partir d'un téléphone mobile et décider de le diriger vers un site mobile qui fonctionne bien à des résolutions inférieures.

En PHP, vous pouvez obtenir le User-Agent via $_SERVER['HTTP_USER_AGENT']

<font face="NSimsun">if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {<br>echo "Veuillez arrêter d'utiliser IE6 !";<br> ><code><font face="NSimsun">if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {<br>echo "Please stop using IE6!";<br>}</font>

Accepter-Langue

<font face="NSimsun">Accepter-Langue : en-us,en;q=0.5<code><font face="NSimsun">Accept-Language: en-us,en;q=0.5</font>

Ces informations décrivent le paramètre de langue par défaut de l'utilisateur. Si le site Web dispose de versions linguistiques différentes, ces informations peuvent être utilisées pour rediriger le navigateur de l'utilisateur.

Il peut contenir plusieurs langues par séparation par virgule. La première sera la langue préférée, et les autres langues porteront une valeur « q » pour indiquer la préférence de l'utilisateur pour la langue (0~1).

Utilisez $_SERVER["HTTP_ACCEPT_LANGUAGE"] en PHP pour obtenir ces informations.

<font face="NSimsun">if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {<br>header('Emplacement : http:// french.mondomaine.com');<br>}<code><font face="NSimsun">if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {<br>header('Location: http://french.mydomain.com');<br>}</font>

Accepter-Encodage

<font face="NSimsun">Accepter-Encodage : gzip,deflate<code><font face="NSimsun">Accept-Encoding: gzip,deflate</font>

La plupart des navigateurs modernes prennent en charge la compression gzip et transmettent ces informations au serveur. À ce moment-là, le serveur enverra le HTML compressé au navigateur. Cela peut réduire la taille des fichiers de près de 80 % pour économiser du temps de téléchargement et de la bande passante.

En PHP, vous pouvez utiliser $_SERVER["HTTP_ACCEPT_ENCODING"] pour obtenir ces informations. Ensuite, l’appel de la méthode ob_gzhandler() détectera automatiquement cette valeur, vous n’avez donc pas besoin de la détecter manuellement.

<font face="NSimsun">// active la mise en mémoire tampon de sortie<br>// et toutes les sorties sont compressées si le navigateur le prend en charge<br>ob_start('ob_gzhandler');<code><font face="NSimsun">// enables output buffering<br>// and all output is compressed if the browser supports it<br>ob_start('ob_gzhandler');</font>

Si-Modifié-Depuis

Si une page a été mise en cache dans votre navigateur, la prochaine fois que vous naviguerez, le navigateur détectera si le document a été modifié, puis il enverra un tel en-tête :

<font face="NSimsun">Si-Modifié-Depuis : samedi 28 novembre 2009 06:38:19 GMT<code><font face="NSimsun">If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT</font>

S'il n'a pas été modifié depuis, le serveur retournera "304 Not Modified" et plus aucun contenu ne sera renvoyé. Le navigateur lira automatiquement le contenu du cache

En PHP, vous pouvez utiliser $_SERVER['HTTP_IF_MODIFIED_SINCE'] pour détecter.

<font face="NSimsun">// supposer que $last_modify_time était la dernière mise à jour de la sortie<br>// le navigateur a-t-il envoyé l'en-tête If-Modified-Since ?<br>if(isset ($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {<br>// si le cache du navigateur correspond à l'heure de modification<br>if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {<br>// envoyer un en-tête 304, et aucun contenu<br>header("HTTP/1.1 304 Not Modified");<br>exit;<br>}<br>}<code><font face="NSimsun">// assume $last_modify_time was the last the output was updated<br>// did the browser send If-Modified-Since header?<br>if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {<br>// if the browser cache matches the modify time<br>if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {<br>// send a 304 header, and no content<br>header("HTTP/1.1 304 Not Modified");<br>exit;<br>}<br>}</font>

Il existe également un en-tête HTTP appelé Etag, qui est utilisé pour déterminer si les informations mises en cache sont correctes. Nous l'expliquerons plus tard.

Cookie

Comme son nom l'indique, il enverra au serveur les informations relatives aux cookies stockées dans votre navigateur.

<font face="NSimsun">Cookie : PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar<code><font face="NSimsun">Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar</font>

Il s'agit d'un ensemble de paires nom-valeur séparées par des points-virgules. Les cookies peuvent également contenir des identifiants de session.

En PHP, un seul cookie peut être obtenu en accédant au tableau $_COOKIE. Vous pouvez directement utiliser le tableau $_SESSION pour obtenir les variables de session. Si vous avez besoin d'un identifiant de session, vous pouvez utiliser la fonction session_id() au lieu du cookie.

<font face="NSimsun">echo $_COOKIE['foo'];<br>// output: bar<br>echo $_COOKIE['PHPSESSID'];<br>// output: r2t5uvjq435r4q7ib3vtdjq120<br>session_start();<br>echo session_id();<br>// output: r2t5uvjq435r4q7ib3vtdjq120</font>

Référent

Comme son nom l'indique, l'en-tête contiendra des informations sur l'URL de référence.

Par exemple, si je visite la page d'accueil de Nettuts et que je clique sur un lien, ces informations d'en-tête seront envoyées au navigateur :
<font face="NSimsun">Referer: http://net.tutsplus.com/ </font>

En PHP, cette valeur peut être obtenue via $_SERVER['HTTP_REFERER'].

<font face="NSimsun">if (isset($_SERVER['HTTP_REFERER'])) {<code><font face="NSimsun">if (isset($_SERVER['HTTP_REFERER'])) {<br>$url_info = parse_url($_SERVER['HTTP_REFERER']);<br>// is the surfer coming from Google?<br>if ($url_info['host'] == 'www.google.com') {<br>parse_str($url_info['query'], $vars);<br>echo "You searched on Google for this keyword: ". $vars['q'];<br>}<br>}<br>// if the referring url was:<br>// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http headers&aq=f&oq=&aqi=g-p1g9<br>// the output will be:<br>// You searched on Google for this keyword: http headers</font>$url_info = parse_url($_SERVER['HTTP_REFERER']);

// l'internaute vient-il de Google ?

if ($url_info['host'] == 'www.google.com') {

parse_str($url_info['query'], $vars);

echo "Vous avez recherché ce mot-clé sur Google : "$vars['q'];

}

}

// si l'URL de référence était :

// http://www. google.com/search?source=ig&hl=en&rlz=&=&q=http headers&aq=f&oq=&aqi=g-p1g9<font face="NSimsun">Authorization: Basic bXl1c2VyOm15cGFzcw==</font>// le résultat sera :

// Vous avez recherché ce mot-clé sur Google : http en-têtes

Vous avez peut-être remarqué que le mot « référent » est mal orthographié en tant que « référent ». Malheureusement, il est entré dans les spécifications HTTP officielles et est resté bloqué.

Autorisation

Lorsqu'une page nécessite une autorisation, le navigateur ouvrira une fenêtre de connexion. Après avoir entré le bon numéro de compte, le navigateur enverra une requête HTTP, mais cette fois, il inclura un tel en-tête :

Cette partie des informations contenues dans l'en-tête est codée en base64. Par exemple, base64_decode('bXl1c2VyOm15cGFzcw==') sera converti en 'myuser:mypass'. En PHP, cette valeur peut être obtenue en utilisant $_SERVER['PHP_AUTH_USER'] et $_SERVER['PHP_AUTH_PW']. Nous expliquerons plus de détails dans la section WWW-Authentifier. Réponse HTTP dans les en-têtes HTTP Maintenant, permettez-moi de comprendre les informations de réponse HTTP dans certains en-têtes HTTP courants. En PHP, vous pouvez définir les informations de réponse d'en-tête via

header()

. PHP a automatiquement envoyé certaines informations d'en-tête nécessaires, telles que le contenu chargé, la configuration des cookies, etc... Vous pouvez voir ce qui a été envoyé et ce qui sera envoyé via la

headers_list()

informations d’en-tête de fonction. Vous pouvez également utiliser la fonction

<font face="NSimsun">Cache-Control: max-age=3600, public</font>headers_sent()

pour vérifier si les informations d'en-tête ont été envoyées.

Cache-Contrôle

La définition de w3.org est la suivante : "Le champ d'en-tête général Cache-Control est utilisé pour spécifier les directives qui DOIVENT être respectées par tous les mécanismes de mise en cache tout au long de la chaîne requête/réponse, où les "mécanismes de mise en cache" incluent certaines des choses que vous avez. Le FAI peut utiliser les informations de passerelle et de proxy. <font face="NSimsun">Cache-Control: no-cache </font>

Par exemple :

<font face="NSimsun">Cache-Control : max-age=3600, public<font color="#6466b3"></font></font> "Public" signifie que cette réponse peut être mise en cache par n'importe qui, et "max-age" indique le nombre de secondes pendant lesquelles le cache sera valide. Permettre à votre site Web d'être mis en cache réduit considérablement le temps de téléchargement et la bande passante, tout en améliorant les vitesses de chargement du navigateur.

Vous pouvez également désactiver la mise en cache en définissant la directive "no-cache" :

<font face="NSimsun">Cache-Control : pas de cache </font>

<font face="NSimsun">Content-Type: text/html; charset=UTF-8</font>Pour plus de détails, veuillez visiter

w3.org. Type de contenu

Cet en-tête contient le "type MIME" du document. Le navigateur utilisera ce paramètre pour décider comment analyser le document. Par exemple, une page html (ou une page php avec une sortie html) renverrait quelque chose comme ceci : <font face="NSimsun">Content-Type : text/html; charset=UTF-8</font>

<font face="NSimsun">Content-Type: image/gif</font>« texte » est le type de document et « html » est le sous-type du document. Cet en-tête comprend également plus d'informations, telles que le jeu de caractères.

S'il s'agit d'une image, cette réponse sera envoyée : <font face="NSimsun">Type de contenu : image/gif</font> Le navigateur peut décider d'utiliser un programme externe ou sa propre extension pour ouvrir le document via le type MIME. L'exemple suivant appelle Adobe Reader :

<font face="NSimsun">Content-Type: application/pdf</font>

Chargez directement, Apache détermine généralement automatiquement le type MIME du document et ajoute les informations appropriées à l'en-tête. Et la plupart des navigateurs ont un certain degré de tolérance aux pannes. Ils détectent automatiquement le type MIME lorsque les informations ne sont pas fournies dans l'en-tête ou sont fournies de manière incorrecte.

Vous pouvez trouver une liste des types MIME couramment utilisés ici.

En PHP, vous pouvez utiliser finfo_file() pour détecter le type ime d'un fichier.

Contenu-Disposition

Cet en-tête indiquera au navigateur d'ouvrir une fenêtre de téléchargement de fichier au lieu d'essayer d'analyser le contenu de la réponse. Par exemple :

<font face="NSimsun">Contenu-Disposition : pièce jointe ; filename="download.zip"<code><font face="NSimsun">Content-Disposition: attachment; filename="download.zip"</font>

Le navigateur affichera une boîte de dialogue comme celle-ci :

Notez que l'en-tête Content-Type approprié sera également envoyé

<font face="NSimsun">Type de contenu : application/zip<br>Disposition du contenu : fichier joint="download.zip"<code><font face="NSimsun">Content-Type: application/zip<br>Content-Disposition: attachment; filename="download.zip"</font>

Longueur du contenu

Lorsque le contenu doit être transmis au navigateur, le serveur peut utiliser cet en-tête pour informer le navigateur de la taille (octets) du fichier à transmettre.

<font face="NSimsun">Longueur du contenu : 89123<code><font face="NSimsun">Content-Length: 89123</font>

Ces informations sont très utiles pour le téléchargement de fichiers. C'est pourquoi le navigateur connaît la progression du téléchargement.

Par exemple, ici, j'ai écrit un script factice pour simuler un téléchargement lent.

<font face="NSimsun">// c'est un fichier zip<br>header('Content-Type: application/zip');<br>// 1 million d'octets (environ 1 mégaoctet) <br>header('Content-Length: 1000000');<br>// charger une boîte de dialogue de téléchargement et l'enregistrer sous download.zip<br>header('Content-Disposition: attachment; filename="download .zip"');<br>// 1 000 fois 1 000 octets de données<br>pour ($i = 0; $i <span style="WHITE- SPACE : pre"><code><font face="NSimsun">// it's a zip file<br>header('Content-Type: application/zip');<br>// 1 million bytes (about 1megabyte)<br>header('Content-Length: 1000000');<br>// load a download dialogue, and save it as download.zip<br>header('Content-Disposition: attachment; filename="download.zip"');<br>// 1000 times 1000 bytes of data<br>for ($i = 0; $i <span style="WHITE-SPACE: pre"></span>echo str_repeat(".",1000);<br><span style="WHITE-SPACE: pre"></span>// sleep to slow down the download<br><span style="WHITE-SPACE: pre"></span>usleep(50000);<br>}</font>echo str_repeat(".",1000);

// sleep pour ralentir le téléchargement

usleep(50000);
}

Le résultat sera comme ceci :

<font face="NSimsun">// it's a zip file<br>header('Content-Type: application/zip');<br>// the browser won't know the size<br>// header('Content-Length: 1000000');<br>// load a download dialogue, and save it as download.zip<br>header('Content-Disposition: attachment; filename="download.zip"');<br>// 1000 times 1000 bytes of data<br>for ($i = 0; $i <span style="WHITE-SPACE: pre"></span>echo str_repeat(".",1000);<br><span style="WHITE-SPACE: pre"></span>// sleep to slow down the download<br><span style="WHITE-SPACE: pre"></span>usleep(50000);<br>}</font>Maintenant, je commente l'en-tête Content-Length :

<font face="NSimsun">// c'est un fichier zip<br>header('Content-Type: application/zip');<br>// le navigateur ne connaîtra pas le size<br>// header('Content-Length: 1000000');<br>// charger une boîte de dialogue de téléchargement et l'enregistrer sous download.zip<br>header('Content-Disposition: attachment; filename ="download.zip"');<br>// 1 000 fois 1 000 octets de données<br>pour ($i = 0; $i <span style="WHITE-SPACE : pre"></span></font>

echo str_repeat(".",1000);

// sleep pour ralentir le téléchargement
/>usleep(50000);
}

Le résultat devient ceci :

Ce navigateur vous indiquera uniquement la quantité qui a été téléchargée, mais pas la quantité qui doit être téléchargée au total. Et la barre de progression n'affichera pas la progression. <font face="NSimsun">Etag: "pub1259380237;gz"</font>

Étag

Il s'agit d'un autre en-tête généré pour la mise en cache. Cela ressemblera à ceci : <font face="NSimsun">Étiquette : "pub1259380237;gz"</font>

<font face="NSimsun">If-None-Match: "pub1259380237;gz"</font>

Le serveur peut répondre au navigateur avec ces informations avec chaque fichier envoyé. La valeur peut contenir la date de dernière modification du document, la taille du fichier ou la somme de contrôle du fichier. La navigation le met en cache avec le document reçu. La prochaine fois que le navigateur demandera à nouveau le même fichier, il enverra la requête HTTP suivante :

<font face="NSimsun">Si-Aucun-Match : "pub1259380237;gz"<p></p></font>

Si la valeur Etag du document demandé est cohérente avec celle-ci, le serveur enverra un code d'état 304 au lieu de 2oo. et ne renvoie pas de contenu. Le navigateur va maintenant charger le fichier depuis le cache. <font face="NSimsun">Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT</font>

Dernière modification

<font face="NSimsun">$modify_time = filemtime($file);<br>header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");</font>Comme son nom l'indique, cette information d'entête indique l'heure de la dernière modification du document au format GMT :

<font face="NSimsun">Dernière modification : samedi 28 novembre 2009 03:50:37 GMT</font>

<font face="NSimsun">$modify_time = filemtime($file);<br>header("Last-Modified: " . gmdate("D, d M Y H:i:s", $ modifier_time) . " GMT");</font> Il fournit un mécanisme de mise en cache alternatif. Le navigateur peut envoyer une requête comme celle-ci :

<font face="NSimsun">If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT</font>

Nous en avons déjà discuté dans la section If-Modified-Since.

Emplacement

Cet en-tête est utilisé pour la redirection. Si le code de réponse est 301 ou 302, le serveur doit envoyer cet en-tête. Par exemple, lorsque vous visitez http://www.nettuts.com, votre navigateur recevra la réponse suivante :

<font face="NSimsun">HTTP/1.x 301 Moved Permanently<br>...<br>Location: http://net.tutsplus.com/<br>...</font>

En PHP, vous pouvez rediriger les visiteurs de cette façon :
<font face="NSimsun">header('Location: http://net.tutsplus.com/');</font>

Par défaut, le code de statut 302 sera envoyé. Si vous souhaitez envoyer le 301, écrivez simplement comme ceci :

<font face="NSimsun">header('Location: http://net.tutsplus.com/', true, 301);</font>

Set-Cookie

Lorsqu'un site Web doit définir ou mettre à jour les informations des cookies pour votre navigation, il utilisera un en-tête comme celui-ci :

<font face="NSimsun">Set-Cookie : skin=noskin; path=/; domain=.amazon.com; expire=Sun, 29-Nov-2009 21:42:28 GMT<code><font face="NSimsun">Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT<br>Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT</font>Set-Cookie : session-id=120-7333518-8165026 ; chemin=/; domaine=.amazon.com ; expire=samedi 27 février 08:00:00 2010 GMT

Chaque cookie sera utilisé comme information d'en-tête distincte. Notez que la définition de cookies via js ne sera pas reflétée dans l'en-tête HTTP.

En PHP, vous pouvez définir des cookies via la fonction setcookie()

, et PHP enverra les en-têtes HTTP appropriés.

<font face="NSimsun">setcookie("TestCookie", "foobar");</font><font face="NSimsun">setcookie("TestCookie", "foobar");</font>

Il enverra des informations d'en-tête comme ceci :

<font face="NSimsun">Set-Cookie: TestCookie=foobar</font><font face="NSimsun">Définir le cookie : TestCookie=foobar</font>

Si aucun délai d'expiration n'est précisé, le cookie sera supprimé après la fermeture du navigateur.

WWW-Authentifier

Un site Web peut envoyer cet en-tête via HTTP pour authentifier l'utilisateur. Lorsque le navigateur voit cette réponse dans l'en-tête, il ouvre une fenêtre contextuelle.

<font face="NSimsun">WWW-Authenticate: Basic realm="Restricted Area"</font><font face="NSimsun">WWW-Authentification : Basic realm="Restricted Area"</font>

Cela ressemblera à ceci :

Dans le chapitre du

manuel PHP, il y a un code simple qui montre comment faire une telle chose avec PHP :

<font face="NSimsun">if (!isset($_SERVER['PHP_AUTH_USER'])) {<br>header('WWW-Authenticate: Basic realm="My Realm"');<br>header('HTTP/1.0 Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web Unauthorized');<br>echo 'Text to send if user hits Cancel button';<br>exit;<br>} else {<br>echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";<br>echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";<br>}</font><font face="NSimsun">if (!isset($_SERVER['PHP_AUTH_USER'])) {</font>

header('WWW-Authenticate: Basic realm="Mon royaume"');

header('HTTP/1.0 Comprendre tous les aspects des en-têtes HTTP Description dimages et de textes_HTML/Xhtml_Production de pages Web Unauthorized');

echo 'Texte à envoyer si l'utilisateur clique sur le bouton Annuler';

exit;

} else {

echo "

Bonjour { $_SERVER['PHP_AUTH_USER']}.

";<font face="NSimsun">Content-Encoding: gzip</font>echo "

Vous avez entré {$_SERVER['PHP_AUTH_PW']} comme mot de passe.

"; >

Encodage de contenu Cet en-tête est généralement défini lorsque le contenu renvoyé est compressé.

<font face="NSimsun">Encodage de contenu : gzip</font>

En PHP, si vous appelez la fonction

ob_gzhandler(), cet en-tête sera défini automatiquement.

Adresse originale : http://css9.net/all-about-http-headers/
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn