Comment puis-je créer une erreur 404 en PHP?

111

Mon .htaccess redirige toutes les demandes /word_herevers /page.php?name=word_here. Le script PHP vérifie ensuite si la page demandée est dans son tableau de pages.

Sinon, comment simuler une erreur 404? J'ai essayé cela, mais cela n'a pas entraîné la configuration de ma page 404 via ErrorDocumentl' .htaccessaffichage.

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

Ai-je raison de penser qu'il est faux de rediriger vers ma page d'erreur 404?

Eric
la source
Pourquoi voulez-vous dire que ça ne marche pas? Avez-vous vérifié l'en-tête de réponse du serveur?
Gumbo le
1
En réponse à votre question finale, oui, ce serait une mauvaise idée de rediriger tous les 404 vers une vraie page. Cela viole la spécification HTTP en transformant quelque chose qui ne devrait pas être là en quelque chose qui est là.
Lucas Oman

Réponses:

157

La réponse à jour (à partir de PHP 5.4 ou plus récent) pour générer 404 pages est d'utiliser http_response_code:

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() n'est pas strictement nécessaire, mais cela garantit que vous ne poursuivez pas l'exécution normale.

lame
la source
dans quel fichier dois-je ajouter ceci?
Julfikar
87

Ce que vous faites fonctionnera et le navigateur recevra un code 404. Ce qu'il ne fera pas est d'afficher la page "introuvable" à laquelle vous vous attendez, par exemple:

Pas trouvé

L'URL demandée /test.php n'a pas été trouvée sur ce serveur.

C'est parce que le serveur Web n'envoie pas cette page lorsque PHP renvoie un code 404 (du moins Apache ne le fait pas). PHP est responsable d'envoyer toute sa propre sortie. Donc, si vous voulez une page similaire, vous devrez envoyer le HTML vous-même, par exemple:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

Vous pouvez configurer Apache pour utiliser la même page pour ses propres messages 404, en mettant ceci dans httpd.conf:

ErrorDocument 404 /notFound.php
JW.
la source
Merci. J'avais supposé qu'il utilisait ma page 404.
Eric le
@JW où le code ci-dessus sera-t-il utilisé? est ce code pour le fichier «.htaccess».
Manohar Kumar
@ManoharKumar utilise le code ci-dessus là où vous souhaitez envoyer la page 404. Dans mon cas, je l'ai utilisé lorsque quelqu'un recherche un élément avec son code, mais il n'existe pas. donc j'utilise le code ci-dessus après avoir découvert que l'élément n'est pas disponible et j'ai également utilisé exit sur la 3ème ligne de ce code, pour éviter de charger quoi que ce soit après la page 404. merci JW, cela a fonctionné parfaitement pour moi.
Harsha
22

Essaye ça:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
la source
3
Eh bien, un 404 est un 404 à la fois en HTTP 1.0 et 1.1. 1.0 est une valeur sûre. Cool blague BTW :) +1
Ates Goral
dans mon cas, je dois donner l'en-tête ("Location: HTTP / 1.0 404 Not Found");
The EasyLearn Academy
9

Créer des pages d'erreur personnalisées via le fichier .htaccess

1. 404 - page non trouvée

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Erreur de serveur interne

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Interdit

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Mauvaise demande

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Autorisation requise

RewriteEngine On
ErrorDocument 401 /401.html

Vous pouvez également rediriger toutes les erreurs vers une seule page. comme

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
la source
Le RewriteEngine n'a rien à voir avec cela; cette ligne peut être omise en toute sécurité pour obtenir le même résultat.
WoodrowShigeru
3

Avez-vous pensé à mourir () après avoir envoyé l'en-tête? L'en-tête 404 n'arrête pas automatiquement le traitement, il peut donc sembler n'avoir rien fait si un traitement supplémentaire est en cours.

Il n'est pas bon de REDIRECT à votre page 404, mais vous pouvez INCLURE le contenu de celle-ci sans problème. De cette façon, vous avez une page qui envoie correctement un statut 404 à partir de l'URL correcte, mais elle a également votre "que recherchez-vous?" page pour le lecteur humain.

Eli
la source
0

essayez de mettre

ErrorDocument 404 /(root directory)/(error file) 

dans le .htaccessfichier.

Faites cela pour toute erreur, mais remplacez 404 par votre erreur.

le crafteryt rouge
la source
0

Dans le CMS Drupal ou Wordpress (et probablement d'autres), si vous essayez de faire en sorte que du code php personnalisé ne semble pas exister (à moins qu'une condition ne soit remplie), ce qui suit fonctionne bien en faisant prendre le relais du gestionnaire 404 du CMS:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
Mike Godin
la source
-2

Immédiatement après cette ligne, essayez de fermer la réponse en utilisant exitoudie()

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

ou

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
user5891645
la source
1
Si vous faites cela, l'utilisateur voit une page vide. Ma question était de savoir comment envoyer la même page 404 avec laquelle j'ai spécifié ErrorDocument, mais à partir de PHP.
Eric
si vous voulez utiliser ErrorDocument Assurez-vous que le chemin d'accès à votre fichier d'erreur personnalisé est par rapport à la racine de l'exemple de serveur: dites que votre chemin virtuel est / dossier1 / dossier2 / myhtaccess à partir de la racine du serveur votre document d'erreur ressemblera à ceci ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumentn'a aucun effet une fois que vous avez déjà saisi le code PHP. cette réponse explique le mieux la confusion à laquelle j'ai fait face il y a 9 ans
Eric
J'espère que votre problème est résolu maintenant. Sur un sujet hors sujet, je pense qu'il vaut mieux ne pas rediriger avec? Name = word_here. Utilisez plutôt $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");dans votre fichier page.php. Parce qu'il y a un scénario où l'une de ces pages attend une requête "nom" de l'utilisateur.
user5891645
-2

essayez ceci une fois.

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
Mani Kandan
la source