En-têtes HTTP pour les nuls

Que vous soyez programmeur ou non, vous l’avez vu partout sur le Web. En ce moment, la barre d'adresse de votre navigateur affiche un élément commençant par "http: //". Même votre premier script Hello World a envoyé des en-têtes HTTP sans que vous ne vous en rendiez compte. Dans cet article, nous allons en apprendre davantage sur les bases des en-têtes HTTP et sur la manière de les utiliser dans nos applications Web..

Que sont les en-têtes HTTP??

HTTP signifie "Protocole de transfert hypertexte". L'ensemble du Web utilise ce protocole. Il a été créé au début des années 1990. Presque tout ce que vous voyez dans votre navigateur est transmis à votre ordinateur via HTTP. Par exemple, lorsque vous avez ouvert cette page d’article, votre navigateur a probablement envoyé plus de 40 demandes HTTP et reçu des réponses HTTP pour chaque message..

Les en-têtes HTTP constituent la partie principale de ces requêtes et réponses HTTP. Elles contiennent des informations sur le navigateur client, la page demandée, le serveur, etc..

Exemple

Lorsque vous tapez une url dans votre barre d’adresse, votre navigateur envoie une requête HTTP qui peut ressembler à ceci:

GET / tutorials / other / top-20-mysql-best-practices / HTTP / 1.1 Hôte: net.tutsplus.com Agent utilisateur: Mozilla / 5.0 (Windows; U; Windows NT 6.1; en-US; version: 1.9. 1.5) Gecko / 20091102 Firefox / 3.5.5 (.NET CLR 3.5.30729) Accepter: texte / html, application / xhtml + xml, application / xml; q = 0,9, * / *; q = 0,8 Accept-Language: en -us, en; q = 0.5 Accept-Encoding: gzip, deflate Accept-Jeu de caractères: ISO-8859-1, utf-8; q = 0.7, *; q = 0.7 Keep-Alive: 300 Connexion: keep-alive Cookie: PHPSESSID = r2t5uvjq435r4q7ib3vtdjq120 Page suivante: no-cache Cache-Control: no-cache

La première ligne est la "Ligne de demande" qui contient des informations de base sur la demande. Et le reste sont les en-têtes HTTP.

Après cette demande, votre navigateur reçoit une réponse HTTP ressemblant à ceci:

HTTP / 1.x 200 OK Codage de transfert: chunked Date: sam. 28 nov. 2009 04:36:25 GMT Serveur: LiteSpeed ​​Connexion: close X-Powered-By: W3 Total Cache / 0.8 Taille: public Expire le: Sam, 28 Nov 2009 05:36:25 GMT Etag: "pub1259380237; gz" Cache-Control: max-age = 3600, public Type de contenu: text / html; charset = UTF-8 Dernière modification: samedi, 28 nov. 2009 03:50:37 GMT X-Pingback: http://net.tutsplus.com/xmlrpc.php Encodage du contenu: gzip Vary: Accepter-encoder, Cookie, Agent utilisateur     Top 20 des meilleures pratiques MySQL - Nettuts+ 

La première ligne est la "ligne d'état", suivie de "en-têtes HTTP", jusqu'à la ligne vide. Après cela, le "contenu" démarre (dans ce cas, une sortie HTML).

Lorsque vous consultez le code source d'une page Web dans votre navigateur, vous ne verrez que la partie HTML et non les en-têtes HTTP, même s'ils ont été transmis ensemble, comme vous le voyez ci-dessus..

Ces demandes HTTP sont également envoyées et reçues pour d'autres choses, telles que des images, des fichiers CSS, des fichiers JavaScript, etc. C'est pourquoi j'ai dit plus tôt que votre navigateur avait envoyé au moins 40 demandes HTTP au moment du chargement de cette page d'article..

Maintenant, commençons à revoir la structure plus en détail.

Comment voir les en-têtes HTTP

J'utilise les extensions Firefox suivantes pour analyser les en-têtes HTTP:

  • Pyromane
  • En-têtes HTTP en direct

En PHP:

  • getallheaders () obtient les en-têtes de requête. Vous pouvez également utiliser le tableau $ _SERVER.
  • headers_list () obtient les en-têtes de réponse.

Plus loin dans l'article, nous verrons quelques exemples de code en PHP.

Structure de la requête HTTP

La première ligne de la requête HTTP est appelée la ligne de requête et comprend 3 parties:

  • La "méthode" indique de quel type de demande il s'agit. Les méthodes les plus courantes sont GET, POST et HEAD.
  • Le "chemin" est généralement la partie de l'URL qui vient après l'hôte (domaine). Par exemple, lorsque vous demandez "http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/", la portion de chemin est "/ tutorials / other / top-20-mysql-best- les pratiques/".
  • La partie "protocole" contient "HTTP" et la version, qui est habituellement 1.1 dans les navigateurs modernes.

Le reste de la demande contient des en-têtes HTTP sous forme de paires "Nom: Valeur" sur chaque ligne. Ceux-ci contiennent diverses informations sur la requête HTTP et votre navigateur. Par exemple, la ligne "User-Agent" fournit des informations sur la version du navigateur et le système d'exploitation que vous utilisez. "Accept-Encoding" indique au serveur si votre navigateur peut accepter une sortie compressée comme gzip.

Vous avez peut-être remarqué que les données du cookie sont également transmises dans un en-tête HTTP. Et s'il y avait une URL de renvoi, cela aurait aussi été dans l'en-tête.

La plupart de ces en-têtes sont facultatifs. Cette requête HTTP aurait pu être aussi petite que celle-ci:

GET / tutorials / other / top-20-mysql-best-practices / HTTP / 1.1 Hôte: net.tutsplus.com

Et vous obtiendrez toujours une réponse valide du serveur Web..

Méthodes de demande

Les trois méthodes de requête les plus couramment utilisées sont: GET, POST et HEAD. Vous êtes probablement déjà familiarisé avec les deux premiers, de l'écriture de formulaires HTML.

GET: récupérer un document

C'est la méthode principale utilisée pour récupérer du HTML, des images, du JavaScript, des CSS, etc. La plupart des données chargées dans votre navigateur ont été demandées à l'aide de cette méthode..

Par exemple, lors du chargement d'un article Nettuts +, la toute première ligne de la requête HTTP ressemble à ceci:

GET / tutorials / other / top-20-mysql-best-practices / HTTP / 1.1… 

Une fois le code HTML chargé, le navigateur commence à envoyer une demande GET pour les images, qui peut ressembler à ceci:

GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP / 1.1… 

Les formulaires Web peuvent être configurés pour utiliser la méthode GET. Voici un exemple.

Prénom:
Nom de famille:

Lorsque ce formulaire est soumis, la requête HTTP commence comme suit:

GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP / 1.1… 

Vous pouvez voir que chaque entrée de formulaire a été ajoutée à la chaîne de requête.

POST: envoyer des données au serveur

Même si vous pouvez envoyer des données au serveur à l'aide de GET et de la chaîne de requête, le POST sera souvent préférable. L'envoi de grandes quantités de données à l'aide de GET n'est pas pratique et présente des limites.

Les demandes POST sont le plus souvent envoyées par des formulaires Web. Changeons l'exemple de formulaire précédent en une méthode POST.

Prénom:
Nom de famille:

La soumission de ce formulaire crée une requête HTTP comme celle-ci:

POST /foo.php HTTP / 1.1 Hôte: localhost Agent utilisateur: Mozilla / 5.0 (Windows; U; Windows NT 6.1; en-US; version: 1.9.1.5) Gecko / 20091102 Firefox / 3.5.5 (.NET CLR 3.5 .30729) Accepter: texte / html, application / xhtml + xml, application / xml; q = 0,9, * / *; q = 0,8 Langue utilisée: en-us, en; q = 0,5 Code accepté: gzip, deflate Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Keep-Alive: 300 Connexion: Keep-Alive Référent: http: //localhost/test.php Content-Type: application / x-www-form-urlencoded Content-Length: 43 first_name = John & last_name = Doe & action = Soumettre

Il y a trois choses importantes à noter ici:

  • Le chemin dans la première ligne est simplement /foo.php et il n'y a plus de chaîne de requête.
  • Des en-têtes Content-Type et Content-Lenght ont été ajoutés. Ils fournissent des informations sur les données envoyées..
  • Toutes les données sont maintenant envoyées après les en-têtes, au même format que la chaîne de requête.

Les demandes de méthode POST peuvent également être effectuées via AJAX, applications, cURL, etc. Et tous les formulaires de téléchargement de fichier sont requis pour utiliser la méthode POST..

HEAD: Récupérer les informations d'en-tête

HEAD est identique à GET, sauf que le serveur ne renvoie pas le contenu de la réponse HTTP. Lorsque vous envoyez une demande HEAD, cela signifie que vous n'êtes intéressé que par le code de réponse et les en-têtes HTTP, pas le document lui-même..

"Lorsque vous envoyez une demande HEAD, cela signifie que vous ne vous intéressez qu'au code de réponse et aux en-têtes HTTP, pas au document lui-même."

Avec cette méthode, le navigateur peut vérifier si un document a été modifié, à des fins de mise en cache. Il peut également vérifier si le document existe du tout.

Par exemple, si votre site Web contient de nombreux liens, vous pouvez envoyer périodiquement des demandes HEAD à tous ceux-ci pour rechercher les liens rompus. Cela fonctionnera beaucoup plus rapidement que d'utiliser GET.

Structure de réponse HTTP

Une fois que le navigateur a envoyé la requête HTTP, le serveur répond par une réponse HTTP. En excluant le contenu, cela ressemble à ceci:

Le premier élément de données est le protocole. C'est encore une fois HTTP / 1.x ou HTTP / 1.1 sur des serveurs modernes.

La partie suivante est le code d'état suivi d'un message court. Le code 200 signifie que notre requête GET a abouti et que le serveur renvoie le contenu du document demandé juste après les en-têtes..

Nous avons tous vu "404" pages. Ce numéro provient en fait de la partie code de statut de la réponse HTTP. Si la demande GET est faite pour un chemin que le serveur ne peut pas trouver, il répondra par un 404 au lieu de 200.

Le reste de la réponse contient des en-têtes similaires à ceux de la requête HTTP. Ces valeurs peuvent contenir des informations sur le logiciel serveur, la date de dernière modification de la page / du fichier, le type MIME, etc.

Encore une fois, la plupart de ces en-têtes sont en fait facultatifs.

Codes d'état HTTP

  • 200 sont utilisés pour les demandes réussies.
  • 300 sont pour les redirections.
  • 400 sont utilisés s'il y avait un problème avec la demande.
  • 500 sont utilisés s'il y avait un problème avec le serveur.

200 OK

Comme mentionné précédemment, ce code d'état est envoyé en réponse à une demande réussie.

206 contenu partiel

Si une application demande uniquement une plage du fichier demandé, le code 206 est renvoyé..

Il est généralement utilisé avec les gestionnaires de téléchargement qui peuvent arrêter et reprendre un téléchargement, ou le scinder en morceaux..

404 introuvable

Lorsque la page ou le fichier demandé est introuvable, un code de réponse 404 est envoyé par le serveur..

401 non autorisé

Les pages Web protégées par mot de passe envoient ce code. Si vous ne vous connectez pas correctement, les éléments suivants peuvent s'afficher dans votre navigateur..

Notez que cela ne concerne que les pages protégées par mot de passe HTTP, qui vous invitent à vous connecter comme ceci:

403 interdit

Si vous n'êtes pas autorisé à accéder à une page, ce code peut être envoyé à votre navigateur. Cela se produit souvent lorsque vous essayez d'ouvrir une URL pour un dossier, qui ne contient aucune page d'index. Si les paramètres du serveur ne permettent pas l'affichage du contenu du dossier, vous obtiendrez une erreur 403..

Par exemple, sur mon serveur local, j'ai créé un dossier d'images. Dans ce dossier, j'ai mis un fichier .htaccess avec cette ligne: "Options -Indexes". Maintenant, quand j'essaye d'ouvrir http: // localhost / images / - je vois ceci:

Il existe d'autres moyens de bloquer l'accès et d'envoyer le numéro 403. Par exemple, vous pouvez bloquer par adresse IP, à l’aide de certaines directives htaccess.

ordre permettre, refuser refuser de 192.168.44.201 refuser de 224.39.163.12 refuser de 172.16.7.92 permettre de tous

302 (ou 307) déplacés temporairement et 301 déplacés de façon permanente

Ces deux codes sont utilisés pour rediriger un navigateur. Par exemple, lorsque vous utilisez un service de raccourcissement d’URL, tel que bit.ly, c’est exactement comme cela qu’ils transfèrent les personnes qui cliquent sur leurs liens..

Les deux navigateurs 302 et 301 sont traités de manière très similaire par le navigateur, mais ils peuvent avoir différentes significations pour les araignées des moteurs de recherche. Par exemple, si votre site Web est en panne pour maintenance, vous pouvez rediriger vers un autre emplacement en utilisant 302. L'araignée du moteur de recherche continuera à consulter votre page ultérieurement. Mais si vous redirigez à l'aide de 301, cela indiquera à l'araignée que votre site Web a été déplacé à cet endroit de façon permanente. Pour vous donner une meilleure idée: http://www.nettuts.com redirige vers http://net.tutsplus.com/ en utilisant un code 301 au lieu de 302.

500 Erreur interne du serveur

Ce code est généralement utilisé lorsqu'un script Web se bloque. La plupart des scripts CGI ne génèrent pas d'erreurs directement dans le navigateur, contrairement à PHP. S'il y a des erreurs fatales, ils enverront simplement un code d'état 500. Et le programmeur doit ensuite rechercher les journaux d’erreur du serveur pour trouver les messages d’erreur.

Liste complète

Vous pouvez trouver la liste complète des codes de statut HTTP avec leurs explications ici.

En-têtes HTTP dans les requêtes HTTP

Nous allons maintenant passer en revue certains des en-têtes HTTP les plus courants trouvés dans les requêtes HTTP..

Presque tous ces en-têtes se trouvent dans le tableau $ _SERVER en PHP. Vous pouvez également utiliser la fonction getallheaders () pour récupérer tous les en-têtes à la fois..

Hôte

Une demande HTTP est envoyée à une adresse IP spécifique. Mais comme la plupart des serveurs sont capables d’héberger plusieurs sites Web sous la même adresse IP, ils doivent savoir quel nom de domaine le navigateur recherche..

Hôte: net.tutsplus.com

Il s’agit essentiellement du nom d’hôte, y compris le domaine et le sous-domaine..

En PHP, il peut être trouvé sous les noms $ _SERVER ['HTTP_HOST'] ou $ _SERVER ['SERVER_NAME'].

Agent utilisateur

Agent utilisateur: Mozilla / 5.0 (Windows; U; Windows NT 6.1; en-US; version: 1.9.1.5) Gecko / 20091102 Firefox / 3.5.5 (.NET CLR 3.5.30729)

Cet en-tête peut contenir plusieurs informations telles que:

  • Nom du navigateur et version.
  • Nom du système d'exploitation et version.
  • Langage par défaut.

Voici comment les sites Web peuvent collecter certaines informations générales sur les systèmes de leurs internautes. Par exemple, ils peuvent détecter si l'internaute utilise un navigateur de téléphone portable et les rediriger vers une version mobile de leur site Web qui fonctionne mieux à basse résolution.

En PHP, on peut le trouver avec: $ _SERVER ['HTTP_USER_AGENT'].

if (strstr ($ _ SERVER ['HTTP_USER_AGENT'], 'MSIE 6'))) echo "Veuillez cesser d'utiliser IE6!"; 

Accepter la langue

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

Cet en-tête affiche le paramètre de langue par défaut de l'utilisateur. Si un site Web a des versions linguistiques différentes, il peut rediriger un nouveau surfeur en fonction de ces données..

Il peut contenir plusieurs langues, séparées par des virgules. Le premier est la langue préférée et chaque langue listée peut porter une valeur "q", qui est une estimation de la préférence de l'utilisateur pour la langue (min. 0 max. 1).

En PHP, il peut être trouvé sous: $ _SERVER ["HTTP_ACCEPT_LANGUAGE"].

if (substr ($ _ SERVER ['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') header ('Emplacement: http://french.mydomain.com'); 

Accepter l'encodage

Accept-Encoding: gzip, deflate

La plupart des navigateurs modernes supportent gzip et l’enverront dans l’en-tête. Le serveur Web peut alors envoyer la sortie HTML dans un format compressé. Cela peut réduire la taille jusqu'à 80% pour économiser la bande passante et le temps.

En PHP, on peut le trouver sous la forme suivante: $ _SERVER ["HTTP_ACCEPT_ENCODING"]. Cependant, lorsque vous utilisez la fonction de rappel ob_gzhandler (), cette valeur est vérifiée automatiquement, vous n'avez donc pas besoin de.

// active la mise en mémoire tampon de la sortie // et toute la sortie est compressée si le navigateur le prend en charge ob_start ('ob_gzhandler');

Si-Modifié-Depuis

Si un document Web est déjà mis en cache dans votre navigateur et que vous le visitez à nouveau, votre navigateur peut vérifier si le document a été mis à jour en envoyant ceci:

If-Modified-Since: sam., 28 nov. 2009 06:38:19 GMT

S'il n'a pas été modifié depuis cette date, le serveur enverra un code de réponse "304 non modifié" et aucun contenu - et le navigateur chargera le contenu à partir du cache..

En PHP, il se trouve sous la forme suivante: $ _SERVER ['HTTP_IF_MODIFIED_SINCE'].

// suppose que $ last_modify_time est la dernière mise à jour de la sortie // le navigateur a-t-il envoyé l'en-tête If-Modified-Since? if (isset ($ _ SERVER ['HTTP_IF_MODIFIED_SINCE']))) // si le cache du navigateur correspond à l'heure de modification if ($ last_modify_time == strtotime ($ _VERVER ['HTTP_IF_MODIFIED_SINCE'])) // envoie un en-tête 304 et pas d'en-tête de contenu ("HTTP / 1.1 304 non modifié"); sortie; 

Il existe également un en-tête HTTP nommé Etag, que vous pouvez utiliser pour vous assurer que le cache est à jour. Nous en reparlerons bientôt.

Biscuit

Comme son nom l'indique, cela envoie les cookies stockés dans votre navigateur pour ce domaine..

Cookie: PHPSESSID = r2t5uvjq435r4q7ib3vtdjq120; foo = bar

Ce sont des paires nom = valeur séparées par des points-virgules. Les cookies peuvent également contenir l'identifiant de session.

En PHP, les cookies individuels sont accessibles avec le tableau $ _COOKIE. Vous pouvez accéder directement aux variables de session à l'aide du tableau $ _SESSION. Si vous avez besoin de l'ID de session, vous pouvez utiliser la fonction session_id () à la place du cookie..

echo $ _COOKIE ['foo']; // sortie: bar echo $ _COOKIE ['PHPSESSID']; // sortie: r2t5uvjq435r4q7ib3vtdjq120 session_start (); echo session_id (); // sortie: r2t5uvjq435r4q7ib3vtdjq120

Référant

Comme son nom l'indique, cet en-tête HTTP contient l'URL de renvoi..

Par exemple, si je visite la page d'accueil Nettuts + et clique sur un lien d'article, cet en-tête est envoyé à mon navigateur:

Référent: http://net.tutsplus.com/

En PHP, on peut le trouver sous la forme $ _SERVER ['HTTP_REFERER'].

if (isset ($ _ SERVER ['HTTP_REFERER']))) $ url_info = parse_url ($ _ SERVER ['HTTP_REFERER']); // le surfeur vient-il de Google? if ($ url_info ['hôte'] == 'www.google.com') parse_str ($ url_info ['query'], $ vars); echo "Vous avez cherché sur Google ce mot-clé:". $ vars ['q'];  // si l'URL de renvoi était: // http://www.google.com/search?source=ig&hl=fr&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9 // la sortie be: // Vous avez cherché sur Google Ce mot-clé: http headers

Vous avez peut-être remarqué que le mot "référant" est mal orthographié comme "référant". Malheureusement, les spécifications HTTP officielles étaient comme ça et restaient bloquées.

Autorisation

Lorsqu'une page Web demande une autorisation, le navigateur ouvre une fenêtre de connexion. Lorsque vous entrez un nom d'utilisateur et un mot de passe dans cette fenêtre, le navigateur envoie une autre requête HTTP, mais cette fois-ci, il contient cet en-tête..

Autorisation: Basic bXl1c2VyOm15cGFzcw ==

Les données à l'intérieur de l'en-tête sont codées en base64. Par exemple, base64_decode ('bXl1c2VyOm15cGFzcw ==') renverrait 'myuser: mypass'

En PHP, ces valeurs peuvent être trouvées comme $ _SERVER ['PHP_AUTH_USER'] et $ _SERVER ['PHP_AUTH_PW'].

Plus à ce sujet quand on parle de l'entête WWW-Authenticate.

En-têtes HTTP dans les réponses HTTP

Nous allons maintenant examiner quelques-uns des en-têtes HTTP les plus courants trouvés dans les réponses HTTP..

En PHP, vous pouvez définir les en-têtes de réponse à l'aide de la fonction header (). PHP envoie déjà automatiquement certains en-têtes, pour charger le contenu et configurer les cookies, etc. Vous pouvez voir les en-têtes qui sont envoyés ou qui seront envoyés avec la fonction headers_list (). Vous pouvez vérifier si les en-têtes ont déjà été envoyés avec la fonction headers_sent ().

Cache-Control

Définition de w3.org: "Le champ d'en-tête général Cache-Control est utilisé pour spécifier les directives qui DOIVENT être obéies par tous les mécanismes de mise en cache tout au long de la chaîne de requête / réponse." Ces "mécanismes de mise en cache" incluent les passerelles et les mandataires que votre fournisseur de services Internet peut utiliser.

Exemple:

Cache-Control: max-age = 3600, public

"public" signifie que la réponse peut être mise en cache par n'importe qui. "max-age" indique combien de secondes le cache est valide. Autoriser la mise en cache de votre site Web peut réduire la charge du serveur et la bande passante, ainsi que réduire les temps de chargement du navigateur..

La mise en cache peut également être empêchée en utilisant la directive "no-cache".

Cache-Control: pas de cache

Pour plus d'informations, voir w3.org.

Type de contenu

Cet en-tête indique le "type mime" du document. Le navigateur décide alors comment interpréter le contenu en fonction de cela. Par exemple, une page HTML (ou un script PHP avec une sortie HTML) peut renvoyer ceci:

Type de contenu: text / html; jeu de caractères = UTF-8

"texte" est le type et "html" est le sous-type du document. L'en-tête peut également contenir plus d'informations telles que charset.

Pour une image gif, cela peut être envoyé.

Type de contenu: image / gif

Le navigateur peut décider d'utiliser une application externe ou une extension de navigateur basée sur le type mime. Par exemple, Adobe Reader sera chargé:

Type de contenu: application / pdf

Lors du chargement direct, Apache peut généralement détecter le type mime d'un document et envoyer l'en-tête approprié. De plus, la plupart des navigateurs ont une certaine tolérance aux pannes et une détection automatique des types MIME, au cas où les en-têtes sont erronés ou absents..

Vous pouvez trouver une liste des types de mime courants ici.

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

Contenu-Disposition

Cet en-tête indique au navigateur d'ouvrir une boîte de téléchargement de fichier au lieu d'essayer d'analyser le contenu. Exemple:

Contenu-Disposition: attachement; filename = "download.zip"

Cela obligera le navigateur à faire ceci:

Notez que l'en-tête Content-Type approprié doit également être envoyé avec ceci:

Content-Type: application / zip Content-Disposition: pièce jointe; filename = "download.zip"

Contenu-Longueur

Lorsque le contenu doit être transmis au navigateur, le serveur peut en indiquer la taille (en octets) à l'aide de cet en-tête..

Longueur du contenu: 89123

Ceci est particulièrement utile pour les téléchargements de fichiers. C'est ainsi que le navigateur peut déterminer la progression du téléchargement..

Par exemple, voici un script factice que j'ai écrit, qui simule un téléchargement lent.

// c'est un en-tête de fichier zip ('Content-Type: application / zip'); // 1 million d'octets (environ 1 mégaoctet) en-tête ('Content-Length: 1000000'); // charge un dialogue de téléchargement, et enregistrez-le sous download.zip header ('Content-Disposition: attachment; filename = "download.zip"'); // 1000 fois 1000 octets de données pour ($ i = 0; $ i < 1000; $i++)  echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); 

Le résultat est:

Maintenant, je vais commenter l'en-tête Content-Length

// c'est un en-tête de fichier zip ('Content-Type: application / zip'); // le navigateur ne connaîtra pas la taille // en-tête ('Content-Length: 1000000'); // charge un dialogue de téléchargement, et enregistrez-le sous download.zip header ('Content-Disposition: attachment; filename = "download.zip"'); // 1000 fois 1000 octets de données pour ($ i = 0; $ i < 1000; $i++)  echo str_repeat(".",1000); // sleep to slow down the download usleep(50000); 

Maintenant, le résultat est:

Le navigateur peut seulement vous dire combien d'octets ont été téléchargés, mais il ne connaît pas le montant total. Et la barre de progression ne montre pas la progression.

Etag

Ceci est un autre en-tête utilisé à des fins de mise en cache. Cela ressemble à ceci:

Etag: "pub1259380237; gz"

Le serveur Web peut envoyer cet en-tête avec chaque document qu’il sert. La valeur peut être basée sur la date de dernière modification, la taille du fichier ou même la valeur de contrôle d'un fichier. Le navigateur enregistre ensuite cette valeur car il met le document en cache. La prochaine fois que le navigateur demande le même fichier, il l'envoie dans la requête HTTP:

If-None-Match: "pub1259380237; gz"

Si la valeur Etag du document correspond à cela, le serveur enverra un code 304 au lieu de 200 et aucun contenu. Le navigateur chargera le contenu de son cache.

Dernière modification

Comme son nom l'indique, cet en-tête indique la date de dernière modification du document, au format GMT:

Dernière modification: samedi, 28 nov. 2009 à 03:50:37 GMT
$ modify_time = filemtime ($ file); header ("Last-Modified:" Last-Modified: ". gmdate (" D, d M Y H: i: s ", $ modify_time)." GMT ");

Il offre un autre moyen au navigateur de mettre en cache un document. Le navigateur peut envoyer ceci dans la requête HTTP:

If-Modified-Since: sam., 28 nov. 2009 06:38:19 GMT

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

Emplacement

Cet en-tête est utilisé pour les redirections. Si le code de réponse est 301 ou 302, le serveur doit également envoyer cet en-tête. Par exemple, lorsque vous allez sur http://www.nettuts.com, votre navigateur recevra ceci:

HTTP / 1.x 301 déplacé de façon permanente… Emplacement: http://net.tutsplus.com/… 

En PHP, vous pouvez rediriger un internaute comme ceci:

en-tête ('Location: http://net.tutsplus.com/');

Par défaut, cela enverra un code de réponse 302. Si vous souhaitez envoyer 301 à la place:

en-tête ('Location: http://net.tutsplus.com/', true, 301);

Set-Cookie

Lorsqu'un site Web souhaite créer ou mettre à jour un cookie dans votre navigateur, il utilise cet en-tête..

Set-Cookie: skin = noskin; chemin = /; domaine = .amazon.com; expires = dim, 29 nov. 2009 21:42:28 GMT Set-Cookie: id-session = 120-7333518-8165026; chemin = /; domaine = .amazon.com; expire = sam 27 fév 08:00:00 2010 GMT

Chaque cookie est envoyé dans un en-tête séparé. Notez que les cookies définis via JavaScript ne passent pas par les en-têtes HTTP..

En PHP, vous pouvez définir des cookies en utilisant la fonction setcookie (), et PHP envoie les en-têtes HTTP appropriés.

setcookie ("TestCookie", "foobar");

Ce qui provoque l'envoi de cet en-tête:

Set-Cookie: TestCookie = foobar

Si la date d'expiration n'est pas spécifiée, le cookie est supprimé à la fermeture de la fenêtre du navigateur..

WWW-Authentifier

Un site Web peut envoyer cet en-tête pour authentifier un utilisateur via HTTP. Lorsque le navigateur voit cet en-tête, il ouvre une fenêtre de dialogue de connexion.

WWW-Authenticate: Basic realm = "Zone restreinte"

Qui ressemble à ceci:

Il y a une section dans le manuel PHP, qui contient des exemples de code sur la façon de le faire en PHP.

if (! isset ($ _ SERVER ['PHP_AUTH_USER']))) header ('WWW-Authenticate: Basic realm = "Mon domaine"'); en-tête ('HTTP / 1.0 401 non autorisé'); echo 'Texte à envoyer si l'utilisateur appuie sur le bouton Annuler'; sortie;  else echo "

Bonjour $ _SERVER ['PHP_AUTH_USER'].

"; écho "

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

";

Contenu-Encodage

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

Content-Encoding: gzip

En PHP, si vous utilisez la fonction de rappel ob_gzhandler (), elle sera automatiquement définie pour vous..

Conclusion

Merci d'avoir lu. J'espère que cet article a été un bon point de départ pour en savoir plus sur les en-têtes HTTP. S'il vous plaît laissez vos commentaires et questions ci-dessous, et je vais essayer de répondre autant que possible.

Si vous souhaitez approfondir votre développement Web, consultez certains des fichiers les plus populaires sur CodeCanyon. Ces scripts, applications, modèles et plugins peuvent vous faire gagner un temps précieux de développement et vous aider à ajouter de nouvelles fonctionnalités rapidement et facilement. Ou obtenez l'assistance d'un développeur professionnel sur Envato Studio.