7.37 HTTP
7 Index des fonctions
Manuel PHP
. Introduction . Pré-requis . Installation . Configuration à l'exécution . Types de ressources . Constantes prédefinies ->header . headers_sent . setcookie
|
7.37.7 header()Envoie un en-tête HTTP[ Exemples avec header ] PHP 3, PHP 4
int
header (
string
string
,
bool
replace
,
int
http_response_code
)
header
permet de spécifier un
en-tête HTTP lors de l'envoi des fichiers HTML. Reportez-vous
à HTTP 1.1 Specification
pour plus d'informations sur les en-têtes HTTP.
Le paramètre optionnel
replace
indique
si la fonction
header
doit remplacer
un en-tête précédemment émis, ou bien ajouter un autre en-tête
du même type. Par défaut, un nouvel en-tête va écraser le
précédent, mais si vous passez
FALSE
dans cet argument, vous pouvez
forcer les en-têtes multiples pour un même type d'en-tête.
Par exemple :
Identification HTTP avec header |
<?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', FALSE); ?>
|
Le second paramètre optionnel force
le code de réponse HTTP à la valeur de the
http_response_code
.
Ce paramètre est disponible en
PHP
4.3.0 et plus récent.
Il y a cependant deux en-têtes spéciaux. Le premier est
"Location". Non seulement il renvoie un en-tête au
client, mais, en plus, il envoie un statut de redirection à
Apache. Du point de vue de l'auteur de script, cela importe peu,
mais pour ceux qui connaissent les rouages internes d'Apache, c'est
primordial.
Redirection HTTP avec header |
<?php header("Location: http://www.php.net/"); /* Redirige le client vers le site PHP */ exit(); /* Garantie que le code ci-dessous n'est jamais exécuté. */ ?>
|
Note |
HTTP/1.1 demande une
URI
absolue comme argument
de Location: ,
y compris le protocole, hôte et chemin absolu. Mais certains
navigateurs acceptent les URI relatives. Vous pouvez généralement
utiliser les variables globales
$_SERVER['HTTP_HOST']
,
$_SERVER['PHP_SELF']
et
dirname
pour
construire vous-même une URI absolue :
Redirection à l'aide de header |
<?php header("Location: http://".$_SERVER['HTTP_HOST'] ."/".dirname($_SERVER['PHP_SELF']) ."/".$relative_url); ?>
|
|
Le deuxième type d'appel spécial regroupe tous les
en-têtes qui commencent par "HTTP/" (la casse n'est
pas importante). Par exemple, si vous avez votre page d'erreur 404
Apache qui pointe sur un script PHP, c'est une bonne idée
que de vous assurer que le script PHP génère une erreur
404. La première chose à faire dans votre script est :
Limitation d'accès à l'aide de header |
<?php header("HTTP/1.0 404 Not Found"); ?>
|
Note |
En PHP 3, cela ne fonctionne que si PHP est compilé comme
module Apache. Vous pouvez arriver au même résultat
en utilisant l'en-tête
Status
.
Limitation d'accès à l'aide de header , en PHP 3 |
<?php header("Status: 404 Not Found"); ?>
|
|
Les scripts PHP génèrent souvent du HTML dynamiquement,
qui ne doit pas être mis en cache, ni par le client, ni par les
proxy intermédiaires. On peut forcer la désactivation du
cache de nombreux clients et proxy avec
Interdire la mise en cache avec header |
<?php header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date du passé header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // toujours modifié header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header("Pragma: no-cache"); // HTTP/1.0 ?>
|
Note |
Vous pouvez vous rendre compte que vos pages ne sont jamais mises
en cache même si vous utilisez tous les en-têtes ci-dessus.
Il existe toute une collection de paramètres que les utilisateurs
peuvent modifier sur leur navigateur pour modifier le
comportement par défaut du cache. En envoyant les en-têtes
ci-dessus, vous pouvez imposer vos propres valeurs.
De plus, les paramètres
session_cache_limiter
et
session.cache_limiter
peuvent être utilisés pour
générer les en-têtes de caches corrects, lorsque les sessions sont
utilisées.
|
N'oubliez jamais que
header
doit être appelée
avant que le moindre contenu ne soit envoyé, soit par des
lignes HTML habituelles dans le fichier, soit par des affichges
PHP. Une erreur très classique est de lire un fichier avec
include
ou
require
,
et de laisser des espaces ou des lignes vides, qui génèreront
un affichage avant que la fonction
header
ne soit appelée. Le même problème existe avec les fichiers
PHP/HTML standards.
header doit toujours être appelé en premier |
<?php
require("user_logging.inc") ?> <?php header("Content-Type: audio/x-pn-realaudio"); ?> // Erreur : Notez la ligne blanche ci-dessus ?>
|
Note |
En PHP 4, vous pouvez utiliser le système de cache (output buffering)
pour contourner ce problème. Tous vos textes générés seront
mis en buffer sur le serveur jusqu'à ce que vous les envoyiez. Vous pouvez
utiliser les fonctions
ob_start
et
ob_end_flush
dans vos scripts, ou en
modifiant la directive de configuration
output_buffering
dans votre fichier
php.ini
ou vos fichiers
de configuration du serveur.
|
Si vous voulez que vos utilisateur recoivent une alerte pour sauver
les fichiers générés, comme par exemple si vous générez un
fichier PDF, vous pouvez utiliser l'en-tête
Content-Disposition pour
fournir un nom de fichier par défaut, à afficher dans le
dialogue de sauvegarde.
Utilisation de header pour générer un fichier de type PDF ou d'un autre type |
<?php header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=downloaded.pdf");
/* ... output pdf file ... */ ?>
|
Note |
Il y a un bug sous Microsoft Internet Explorer 4.01 qui empêche
cet en-tête de fonctionner. Il n'y a pas d'autre solution.
Il y a aussi un bug dans Microsoft Internet Explorer 5.5 qui
interfère avec ceci, mais qui peut être résolu en utilisant
le Service Pack 2 ou plus récent.
|
Note |
Si safe mode est activé, l'UID du script est ajouté
à la partie
realm
des en-têtes
WWW-Authenticate
que vous envoyez avec
cet en-tête.
|
Voir aussi
headers_sent
,
setcookie
, et la section sur
l'authentification HTTP .
|