¿Cómo puedo crear un error 404 en PHP?

111

Mi .htaccess redirige todas las solicitudes /word_herea /page.php?name=word_here. El script PHP luego verifica si la página solicitada está en su conjunto de páginas.

Si no es así, ¿cómo puedo simular un error 404? Intenté esto, pero no resultó en mi página 404 configurada a través ErrorDocumentde la .htaccesspresentación.

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

¿Tengo razón al pensar que está mal redirigir a mi página de error 404?

Eric
fuente
¿Por qué quieres decir que no funciona? ¿Verificó el encabezado de respuesta del servidor?
Gumbo
1
En respuesta a su pregunta final, sí, sería una mala idea redirigir todos los 404 a una página real. Esto viola la especificación HTTP al convertir algo que no debería estar allí en algo que está allí.
Lucas Oman

Respuestas:

156

La respuesta actualizada (a partir de PHP 5.4 o posterior) para generar páginas 404 es usar http_response_code:

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

die() no es estrictamente necesario, pero se asegura de que no continúe con la ejecución normal.

espada
fuente
¿en qué archivo debo agregar esto?
Julfikar
87

Lo que está haciendo funcionará y el navegador recibirá un código 404. Lo que no hará es mostrar la página "no encontrada" que podría estar esperando, por ejemplo:

Extraviado

La URL solicitada /test.php no se encontró en este servidor.

Eso es porque el servidor web no envía esa página cuando PHP devuelve un código 404 (al menos Apache no lo hace). PHP es responsable de enviar toda su propia salida. Entonces, si desea una página similar, deberá enviar el HTML usted mismo, por ejemplo:

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

Puede configurar Apache para usar la misma página para sus propios mensajes 404, colocando esto en httpd.conf:

ErrorDocument 404 /notFound.php
JW.
fuente
Gracias. Supuse que usaba mi página 404.
Eric
@JW, ¿dónde se usará el código anterior? es ese código para el archivo '.htaccess'.
Manohar Kumar
@ManoharKumar, utilice el código anterior en el lugar donde desea enviar la página 404. En mi caso, lo he usado cuando alguien busca un artículo con su código, pero no existe. así que utilizo el código anterior después de descubrir que el artículo no está disponible y también utilicé exit en la tercera línea de este código, para evitar cargar nada después de la página 404. gracias JW, funcionó perfectamente para mí.
Harsha
22

Prueba esto:

<?php
header("HTTP/1.0 404 Not Found");
?>
Ates Goral
fuente
3
Bueno, un 404 es un 404 tanto en HTTP 1.0 como en 1.1. 1.0 es una apuesta segura. Broma genial BTW :) +1
Ates Goral
en mi caso tengo que dar encabezado ("Ubicación: HTTP / 1.0 404 no encontrado");
The EasyLearn Academy
9

Cree páginas de error personalizadas a través del archivo .htaccess

1. 404 - página no encontrada

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500 - Error interno del servidor

RewriteEngine On
ErrorDocument 500 /500.html

3. 403 - Prohibido

RewriteEngine On
ErrorDocument 403 /403.html

4. 400 - Solicitud incorrecta

RewriteEngine On
ErrorDocument 400 /400.html

5. 401 - Se requiere autorización

RewriteEngine On
ErrorDocument 401 /401.html

También puede redirigir todos los errores a una sola página. me gusta

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
Irshad Khan
fuente
El RewriteEngine no tiene nada que ver con esto; esa línea se puede omitir con seguridad para lograr el mismo resultado.
WoodrowShigeru
3

¿Recuerdas morir () después de enviar el encabezado? El encabezado 404 no detiene automáticamente el procesamiento, por lo que puede parecer que no ha hecho nada si se está procesando más.

No es bueno REDIRECCIONAR a su página 404, pero puede INCLUIR el contenido sin problemas. De esa manera, tiene una página que envía correctamente un estado 404 desde la URL correcta, pero también tiene su "¿qué está buscando?" página para el lector humano.

Eli
fuente
0

intenta poner

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

en .htaccessarchivo.

Haga esto por cualquier error, pero sustituya 404 por su error.

el crafteryt rojo
fuente
0

En el CMS de Drupal o Wordpress (y probablemente en otros), si está intentando hacer que algún código PHP personalizado parezca no existir (a menos que se cumpla alguna condición), lo siguiente funciona bien al hacer que el controlador 404 del CMS se haga cargo:

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

Inmediatamente después de esa línea, intente cerrar la respuesta usando exitodie()

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

o

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
usuario5891645
fuente
1
Si hace esto, el usuario verá una página vacía. Mi pregunta era cómo enviar la misma página 404 con la que especifiqué ErrorDocument, pero desde PHP.
Eric
si desea utilizar ErrorDocument Asegúrese de que la ruta a su archivo de error personalizado sea con respecto a la raíz del servidor ejemplo: digamos que su ruta virtual es / carpeta1 / carpeta2 / myhtaccess desde la raíz del servidor, su documento de error se verá así ErrorDocument 404 /folder1/folder2/my404.html
user5891645
ErrorDocumentno tiene ningún efecto después de haber ingresado el código PHP. esta respuesta explica mejor la confusión que enfrenté hace 9 años
Eric
Espero que tu problema ya esté resuelto. En un tema diferente, creo que es mejor que no redirija con? Name = word_here. En su lugar, utilícelo $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");en su archivo page.php. Porque hay un escenario en el que una de esas páginas espera un "nombre" de consulta del usuario.
user5891645
-2

intente esto una vez.

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