cresus18
Messages postés35Date d'inscriptiondimanche 20 juillet 2003StatutMembreDernière intervention13 février 2008
-
23 août 2007 à 00:27
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 2014
-
23 août 2007 à 21:26
Bonjour à tous.
J'ai un problème avec mon erreur 404 personnalisée qui semble apparaitre aléatoirement.
Ce que je veux dire par là, c'est que quand je génère une erreur, des fois je reçois ma page 404 personnalisée, des fois je reçois la page par défaut d'Internet Explorer. En appuyant sur F5 pour répéter l'erreur 404 avec la même URL, c'est de même aléatoire.
Dans ma page 404 personnalisée, j'ai bien mis en toute première ligne
<?phpheader('HTTP/1.0 404 Not Found') ; ?>
Quand j'enlève cette ligne, le problème n'apparait pas.
Je l'ai remplacée par
<?phpheader('Status: 404 Not Found') ; ?>
mais c'est pareil.
Par contre, j'ai un script PHP qui m'envoie un email pour me prévenir de l'erreur, et que ce soit ma page personnalisée ou celle par défaut, je reçois l'email. Ce qui prouve que ma page est bien exécutée, juste qu'elle n'est pas tout le temps affichée.
Cela ne se produit qu'avec Internet Explorer. Testé avec Firefox, je reçois toujours ma page personnalisée.
Mon serveur tourne sous Linux avec Apache 1.3.37, PHP version 4.4.6.
cresus18
Messages postés35Date d'inscriptiondimanche 20 juillet 2003StatutMembreDernière intervention13 février 20081 23 août 2007 à 12:26
Merci pour ta réponse Alex.
J'ai déja essayé de mettre ça dans le .htaccess mais je ne devrais pas en avoir besoin car toutes les requêtes de pages sont envoyées à un script unique via ce fichier .htaccess :
Le problème est que :
- J'arrive à voir ma page 404 personnalisée, j'appuie sur F5 et ça peut encore me sortir ma page ou celle par défaut
ou bien :
- Je vois la page par défaut, j'appuie sur F5 et ça peut me sortir ma page ou encore celle par défaut.
J'ai déjà essayé de gonfler ma page car elle est censé être plus grande que 512 bytes pour être affichée avec Internet Explorer, et le problème persiste: ma page est exécutée (car je reçois mon email pour m'alerter) mais affiche celle par défaut...
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 23 août 2007 à 13:05
la commande header provoque une redirection immédiate. La ligne du dessous n'est pas exécutée, je dirais :
$phpfile = 'error404.php' ;
Les régles de réécriture sont exécutées avant un quelqconque script.
Tes règles n'agissent pas forcément sur le comportement du serveur en cas d'erreur.
La ligne errordocument est utile.
cresus18
Messages postés35Date d'inscriptiondimanche 20 juillet 2003StatutMembreDernière intervention13 février 20081 23 août 2007 à 19:48
J'ai résolu mon problème.
Pour ceux qui lisent ce post, je voudrais d'abord éclaircir certaines choses.
La commande 'header' neprovoquepas une redirection immédiate lorsqu'il s'agit de signifier le statut HTTP à envoyer. Testes par toi même, le code suivant affiche bien "hello world", la ligne qui suit est bien exécutée :
header
('HTTP/1.0 404 Not Found') ;
echo'hello world' ;
D'ailleurs, si ça provoquait une redirection immédiate, jamais je ne verrais ma page personnalisée car elle n'est appellée nulle part ailleurs dans mon script (encore heureux) et que je n'utilise pas la commande ErrorDocument.
Aussi, je ne dénie pas l'utilité de la commande ErrorDocument, mais il y a tout à fait moyen de faire sans. Dans mon cas, j'ai du trouver une alternative qui est d'utiliser la fonction PHP 'file_exist' et de gérer ça manuellement.
J'ai essayé d'isoler le problème en passant en commentaire la plupart de mon code ainsi que le contenu des fichiers inclus par les fonctions 'require'. Je me suis aperçu que le problème n'apparaissait que lorsque que je cherchais à inclure le premier fichier 'header.php' :
require($_SERVER['DOCUMENT_ROOT'] . '/header.php') ;
J'ai cherché des heures et des heures autour en passant tout mon code à la moulinette. La solution est d'utiliser output buffering et d'entourer la ligne fautive de cette façon :
ob_start() ;
require($_SERVER['DOCUMENT_ROOT'] . '/header.php') ;
ob_end_flush() ;
Je ne saisi toujours pas exactement pourquoi cela marche mieux de cette façon, car une fois les headers envoyés je ne pensais pas qu'il serait encore nécessaire d'utiliser output buffering dans ce but...
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 23 août 2007 à 21:26
La commande 'header' neprovoquepas une redirection immédiate lorsqu'il s'agit de signifier le statut HTTP à envoyer. Testes par toi même, le code suivant affiche bien "hello world", la ligne qui suit est bien exécutée :
J'ai confondu avec header("location: url").
Les fonctions de temporisation de sortie (ob) servent, entre autre, à contourner la limitation de la commande header à être la première sortie du script php avant toute ligne vide ou tout html (même l'entête du document).
ob_start : toutes les sorties sont mises en attente
ob_end_flush : les sorties sont faites dans le bon ordre.
Cela vient peut être du fait qu'avant ton appel à header, il y a une ligne vide ou quelquechose qui est envoyé. Normalement tu n'as pas besoin d'utiliser ces fonctions (sauf justement quand il faut contourner cette limitation, par exemple).