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
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.
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-Encoding : gzip,deflate
Accepter-Charset : ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-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
Pragma : no-cache
Cache-Control : no-cacheLa 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 :
Transfer-Encoding : chunked
Date : samedi 28 novembre 2009 04:36:25 GMTServeur : 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 : gzipVary : 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
2.
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 :
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.
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.
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.
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 :
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 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.
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.
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
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 :
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 :
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 .
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.
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'].
<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 :
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>
<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>
<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 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.
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>
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']);
if ($url_info['host'] == 'www.google.com') {
parse_str($url_info['query'], $vars);}
// 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 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
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>
<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.
<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.
<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.
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>
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);
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>
// 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>
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>
<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>
<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.
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>
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.
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 :
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>
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 Adresse originale : http://css9.net/all-about-http-headers/