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.

Danorton
la source
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.

Alan Storm
la source
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.

Evan Fosmark
la source
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.

Bob Fanger
la source
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 -->
Silviu-Marian
la source
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();
}
Kitet
la source
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.

Moteur de la Terre
la source
4

essayez avec:

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

Au revoir!

Olaf
la source
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.");
}

la source
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

Jesse
la source
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.

Gombo
la source
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");
Jacob Stazewski
la source
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();
}
Mohammad Farhoudi
la source
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.

GGG
la source
-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

GorillaApe
la source
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>';
cigale
la source
4
Cela devrait recevoir une sorte de badge pour la pire réponse que j'ai vue sur ce site.
MadTurki
1
@MadTurki Il y a bien pire.
bjb568