¿Por qué mi aplicación PHP no envía un error 404?

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

¿Por qué no funciona esto? Me sale una página en blanco.

Danorton
fuente
1
Una mejor opción sería enviar un estado 404 e incluir su página 404 personalizada de inmediato. Eso es lo que solía hacer.
Rocky
En mi servidor PHP funciona perfectamente. La línea anterior devuelve la página 404 predeterminada del servidor. Supongo que esto se puede configurar en el servidor.
Elmue

Respuestas:

306

Su código es técnicamente correcto. Si miraras los encabezados de esa página en blanco, verías un encabezado 404, y otras computadoras / programas podrían identificar correctamente la respuesta como un archivo no encontrado.

Por supuesto, sus usuarios siguen siendo SOL. Normalmente, los 404 son manejados por el servidor web.

  • Usuario: Oye, ¿tienes algo para mí en este servidor web URI?
  • Servidor web: ¡No, no lo hago, 404! Aquí hay una página para mostrar para 404s.

El problema es que, una vez que el servidor web comienza a procesar la página PHP, ya pasó el punto donde manejaría un 404

  • Usuario: Oye, ¿tienes algo para mí en este servidor web URI?
  • Servidor web: Sí, lo hago, es una página PHP. Te dirá cuál es el código de respuesta
  • PHP: ¡Hola, Dios mío 404!
  • Servidor web: Bueno, la gente de 404 páginas ya se ha ido a casa, así que enviaré lo que PHP me dio

Además de proporcionar un encabezado 404, PHP ahora es responsable de generar la página 404 real.

Alan Storm
fuente
49
Niña de 14 años o no, el pequeño diálogo cursi realmente tenía sentido para mí.
rbwhitaker
20
PHP tenía 14 años en aquel entonces
Adam Lynch el
1
Stack Overflow necesita agregar funcionalidad a +1 para darle estilo. Esto obtendría todos los +1.
Jay Querido
30
¡Así es como se debe escribir la documentación! Especialmente la documentación de Apache, que realmente odio :)
Harry
44
sangrientamente explicado! ¡me alegró el día!
Andrei Cristian Prodan
78
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 miras las dos últimas líneas de eco, ahí es donde verás el contenido. Puedes personalizarlo como quieras.

Evan Fosmark
fuente
74

Ese es el comportamiento correcto , depende de usted crear los contenidos para la página 404.
El encabezado 404 es utilizado por las arañas y los administradores de descargas para determinar si el archivo existe.
(Una página con un encabezado 404 no será indexada por Google u otros motores de búsqueda)

Sin embargo, los usuarios normales no miran los encabezados http y usan la página como una página normal.

Bob Fanger
fuente
20
FWIW, en caso de 404, IE devuelve su página estándar 'no encontrado' si el contenido es corto (se supone que el servidor solo dice 'no encontrado' y decide mostrar una página más agradable al usuario).
Serge Wautier
16

Para el registro, este es el manejador de todos los casos:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
Silviu-Marian
fuente
se die()requiere?
Daniel dice Restablecer a Mónica el
No, solo coloca esas cosas en la parte superior del archivo, luego continúa con una página 404 personalizada.
Silviu-Marian
14

Cargue la página 404 del servidor predeterminado, si tiene una, por ejemplo, definida para apache:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
Kitet
fuente
no funciona, muestra Advertencia: readfile (404missing.html): no se pudo abrir la secuencia: No existe dicho archivo o directorio en /var/www/.com/public_html/index1.php en la línea 61
2
@AMB Eso es porque tienes que crear ese archivo tú mismo.
Super Cat
@SuperCat gracias, ahora releí el error y todo está claro ahora.,
4

Otra solución, basada en @ Kitet's.

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 está programando un sitio web alojado en un servidor que no tiene control, no sabrá qué archivo es el "404missing.html". Sin embargo, aún puedes hacer esto.

De esta manera, proporcionó exactamente el mismo resultado de una página 404 normal en el mismo servidor. Un observador no podrá distinguir entre una página PHP existente devuelve 404 y una página no existente.

Motor de tierra
fuente
4

probar con:

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

¡Adiós!

Olaf
fuente
2

Una versión un poco más corta. Suprimir eco extraño.

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.");
}

fuente
2
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;
}

nunca simplifique las declaraciones de eco, y nunca olvide el punto y coma como el anterior, también por qué ejecutar un substr en la página, podemos ejecutar fácilmente php_self

Jesse
fuente
2
porque REQUEST_URI no es lo mismo que PHP_SELF. Especialmente si tienes reescritura de URL.
Timo Huovinen
1

Si desea que se muestre la página de error predeterminada del servidor, debe manejar esto en el servidor.

Gumbo
fuente
1

Lo estás haciendo bien, aunque podría necesitar un poco de refinamiento. Parece que se ha abordado, así que hablemos de los beneficios prácticos de la aplicación:

Un antiguo sitio web nuestro que tiene una gran colección de documentos tecnológicos multilingües estaba ejecutando esto dentro de un condicional si no:

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

El problema (además del mensaje inútil y la mala experiencia del usuario) es que generalmente utilizamos un rastreador de enlaces (en nuestro caso, integridad) para verificar los enlaces malos y los documentos faltantes. Esto significa que estábamos obteniendo una respuesta 200 sin errores perfectamente correcta que nos decía que había un archivo allí. Integrity no sabía que estábamos esperando un PDF, así que tuvimos que agregar manualmente un encabezado 404 con php. Al agregar su código sobre el dado (porque nada se ejecutará después y el encabezado siempre debe estar antes de cualquier html procesado de todos modos), la integridad (que se comporta más o menos como un navegador) devolvería un 404 y sabríamos exactamente dónde buscar faltas archivos Hay formas más elegantes de decirle al usuario que hay un error,

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

Prueba esto:

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

Sabes, en mi sitio web creé algo como esto:

        $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>");

}

Espero que te ayude.

GGG
fuente
-4

Llegué a este problema ... ¡Creo que redirigir a un enlace no existente en su servidor podría ser el truco! Debido a que el servidor devolvería su 404:
header('Redirect abbb.404.nonexist');<que no existe con seguridad

GorilaApe
fuente
77
Eso también devolvería un 302 si haces eso. Mejor no redirija sus 404. en su lugar use el código de estado 404 y muestre el mensaje no encontrado.
Rocky
-17

Si desea mostrar la página 404 predeterminada del servidor, puede cargarla en un marco como este:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';
cigarra
fuente
44
Esto debería recibir algún tipo de insignia para la peor respuesta que he visto en este sitio.
MadTurki
1
@MadTurki Hay mucho peores.
bjb568