web-dev-qa-db-fra.com

Pourquoi mon PHP app n'envoie-t-il pas une erreur 404?

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

Pourquoi cela ne fonctionne-t-il pas? Je reçois une page blanche.

141
Yrrol

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

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 le fais pas, 404! Voici une page à afficher pour 404.

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

  • Utilisateur: Hé, avez-vous quelque chose pour moi sur ce serveur Web URI?
  • Serveur Web: Oui, c'est une page PHP. Elle 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, je vais donc envoyer ce que PHP m'a donné

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

306
Alan Storm
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.

78
Evan Fosmark

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 spiders 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)

Les utilisateurs normaux ne consultent toutefois pas les en-têtes http et utilisent la page comme une page normale.

74
Bob Fanger

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

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

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

Charger la page 404 du serveur par défaut, si vous en avez une, par exemple. défini pour Apache:

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

Depuis php 5.4, vous pouvez maintenant faire http_response_code(404);

13
rparker

Une autre solution, basée sur @ 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 que 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 manière, vous avez fourni exactement le même résultat qu'une page 404 normale sur le même serveur. Un observateur ne pourra pas faire la distinction entre une page existante PHP retourne 404 et une page inexistante.

4
Earth Engine

essayer avec:

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

Au revoir!

4

Une version un peu plus courte. Supprimer les échos impairs.

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
artoodetoo
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, pourquoi aussi lancer un sous-substrat sur la page, on peut facilement simplement lancer php_self

2
Jesse

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();
}
1
Mohammad Farhoudi

Vous le faites bien, mais il pourrait être affiné. On dirait que cela a été résolu alors parlons des avantages pratiques de l'application:

Un de nos vieux sites Web, qui contient une vaste collection de documents techniques multilingues, l'exécutait dans un autre condition:

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

Le problème (outre le message inutile et 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 rechercher les liens incorrects 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 ne serait ensuite exécuté et l'en-tête devrait toujours être 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 fichiers manquants. Il existe des moyens plus élégants de signaler à l’utilisateur qu’une erreur se produit, mais en signalant une erreur 404, vous avertissez non seulement les navigateurs et les programmes similaires à ceux d'un navigateur, mais (je crois - corrigez-moi si je me trompe) enregistrez également ces erreurs dans les journaux de votre serveur, où vous pouvez facilement grep pour 404.

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

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

1
Gumbo

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.

0
GGG