if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Pourquoi ça ne marche pas? J'obtiens une page blanche.
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
Pourquoi ça ne marche pas? J'obtiens une page blanche.
Réponses:
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.
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
En plus de fournir un en-tête 404, PHP est désormais 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 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.
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 -->
die()
nécessaire?
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();
}
Depuis php 5.4, vous pouvez maintenant faire http_response_code(404);
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.
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.");
}
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
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");
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 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.
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
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>';