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.
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.
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
En plus de fournir un en-tête 404, PHP est maintenant responsable de la sortie de la page 404 réelle.
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.
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.
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 -->
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();
}
Depuis php 5.4, vous pouvez maintenant faire http_response_code(404);
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.
essayer avec:
header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');
Au revoir!
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.");
}
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
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();
}
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");
Si vous souhaitez que la page d'erreur par défaut du serveur soit affichée, vous devez la gérer sur le serveur.
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: "".$_SERVER['REQUEST_URI']."", 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.