Pourquoi mon application PHP n'enverra-t-elle pas une erreur 404?


140
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

Pourquoi ça ne marche pas? J'obtiens une page blanche.


1
La meilleure option serait d'envoyer un statut 404 et d'inclure immédiatement votre page 404 personnalisée. C'est ce que je faisais.
Rocky

Sur mon serveur PHP, cela fonctionne parfaitement. La ligne ci-dessus renvoie la page 404 par défaut du serveur. Je suppose que cela peut être configuré dans le serveur.
Elmue

Réponses:


306

Votre code est techniquement correct. Si vous regardiez les en-têtes de cette page vierge, vous verriez un en-tête 404 et d'autres ordinateurs / programmes seraient en mesure d'identifier correctement la réponse en tant que fichier introuvable.

Bien sûr, vos utilisateurs sont toujours SOL. Normalement, les 404 sont gérés par le serveur Web.

  • Utilisateur: Hé, avez-vous quelque chose pour moi sur ce serveur Web URI?
  • Serveur Web: Non, je ne sais pas, 404! Voici une page à afficher pour les 404.

Le problème est qu'une fois que le serveur Web commence à traiter la page PHP, il a déjà dépassé le point où il gérerait un 404

  • Utilisateur: Hé, avez-vous quelque chose pour moi sur ce serveur Web URI?
  • Serveur Web: Oui, je le fais, c'est une page PHP. Il vous dira quel est le code de réponse
  • PHP: Hé, OMG 404 !!!!!!!
  • Serveur Web: merde, les gens de 404 pages sont déjà rentrés chez eux, donc je vais simplement envoyer tout ce que PHP m'a donné

En plus de fournir un en-tête 404, PHP est désormais responsable de la sortie de la page 404 réelle.


49
Fille de 14 ans ou pas, le petit dialogue ringard a vraiment fait sens pour moi.
rbwhitaker

20
PHP avait 14 à l'époque
Adam Lynch

1
Stack Overflow doit ajouter des fonctionnalités à +1 pour le style. Cela obtiendrait tous les + 1.
Jay Querido

30
C'est ainsi que la documentation doit être écrite! Surtout la documentation Apache, que je déteste vraiment :)
Harry

4
sanglant brillamment expliqué! fait ma journée!
Andrei Cristian Prodan

78
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

Si vous regardez les deux dernières lignes d'écho, c'est là que vous verrez le contenu. Vous pouvez le personnaliser comme vous le souhaitez.


74

C'est un comportement correct , c'est à vous de créer le contenu de la page 404.
L'en-tête 404 est utilisé par les araignées et les gestionnaires de téléchargement pour déterminer si le fichier existe.
(Une page avec un en-tête 404 ne sera pas indexée par Google ou d'autres moteurs de recherche)

Cependant, les utilisateurs normaux ne regardent pas les en-têtes http et utilisent la page comme une page normale.


20
FWIW, dans le cas de 404, IE renvoie sa page standard «non trouvé» si le contenu est court (il suppose que le serveur dit simplement «non trouvé» et décide d'afficher une page plus agréable à l'utilisateur).
Serge Wautier

16

Pour mémoire, voici le gestionnaire de toutes les cas:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

est die()nécessaire?
Daniel dit réintégrer Monica le

Non, placez simplement ces éléments en haut du fichier, puis passez à une page 404 personnalisée.
Silviu-Marian

14

Chargez la page 404 du serveur par défaut, si vous en avez une, par exemple définie pour apache:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

cela ne fonctionne pas, il affiche Avertissement: readfile (404missing.html): impossible d'ouvrir le flux: aucun fichier ou répertoire de ce type dans /var/www/.com/public_html/index1.php en ligne 61

2
@AMB C'est parce que vous devez créer ce fichier vous-même.
Super Cat

@SuperCat merci, maintenant je relis l'erreur et tout est clair maintenant.,


4

Une autre solution, basée sur celle de @ Kitet.

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);

Si vous programmez un site Web hébergé sur un serveur dont vous n'avez pas le contrôle, vous ne saurez pas quel fichier est le "404missing.html". Cependant, vous pouvez toujours le faire.

De cette façon, vous avez fourni exactement le même résultat d'une page 404 normale sur le même serveur. Un observateur ne pourra pas faire la distinction entre une page PHP existante renvoie 404 et une page inexistante.


4

essayez avec:

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

Au revoir!


2

Version un peu plus courte. Supprime l'écho impair.

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}

2
if($_SERVER['PHP_SELF'] == '/index.php'){ 
   header('HTTP/1.0 404 Not Found');
   echo "<h1>404 Not Found</h1>";
   echo "The page that you have requested could not be found.";
   die;
}

ne simplifiez jamais les instructions echo, et n'oubliez jamais le point virgule comme ci-dessus, aussi pourquoi exécuter un substr sur la page, nous pouvons facilement lancer php_self


2
car REQUEST_URI n'est pas le même que PHP_SELF. Surtout si vous avez une réécriture d'URL.
Timo Huovinen

1

Si vous voulez que la page d'erreur par défaut du serveur soit affichée, vous devez gérer cela dans le serveur.


1

Vous le faites bien, même si cela pourrait nécessiter un certain raffinement. On dirait que cela a été résolu, alors parlons des avantages pratiques de l'application:

Un ancien site Web qui contient une grande collection de documents techniques multilingues l'exécutait dans un conditionnel if else:

    if (<no file found>){
        die("NO FILE HERE");
    }

Le problème (en plus du message inutile et de la mauvaise expérience utilisateur) est que nous utilisons généralement un robot d'exploration de liens (dans notre cas, l'intégrité) pour vérifier les mauvais liens et les documents manquants. Cela signifie que nous obtenions une réponse parfaitement correcte 200 sans erreur nous indiquant qu'il y avait un fichier là-bas. Integrity ne savait pas que nous attendions un PDF, nous avons donc dû ajouter manuellement un en-tête 404 avec php. En ajoutant votre code au-dessus du dé (car rien après ne s'exécuterait et l'en-tête devrait toujours être avant tout html rendu de toute façon), l'intégrité (qui se comporte plus ou moins comme un navigateur) renverrait un 404 et nous saurions exactement où chercher les manquants des dossiers. Il existe des moyens plus élégants de dire à l'utilisateur qu'il y a une erreur,

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

1

Essaye ça:

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
    echo "<head><title>404 Not Found</title></head>";
    echo "<h1>Not Found</h1>";
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    echo "<p>The requested URL ".$uri." was not found on this server.</p>";
    exit();
}

0

Vous savez, sur mon site Web, j'ai créé quelque chose comme ceci:

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, doesn't exists on this server.";
        $maybe=str_replace('.php','',$uri);
        $maybe=str_replace('/','',$maybe);
        die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");

}

J'espère que ça t'aide.


-4

Je suis venu à ce problème .. Je pense que la redirection vers un lien inexistant sur votre serveur pourrait faire l'affaire! Parce que le serveur renverrait son 404:
header('Redirect abbb.404.nonexist');<qui n'existe pas à coup sûr


7
Cela renverrait également un 302 si vous faites cela. Mieux vaut ne pas rediriger vos 404. à la place, utilisez le code d'état 404 et affichez le message introuvable.
Rocky

-17

Si vous souhaitez afficher la page 404 par défaut du serveur, vous pouvez la charger dans un cadre comme celui-ci:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
Cela devrait recevoir une sorte de badge pour la pire réponse que j'ai vue sur ce site.
MadTurki

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.