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.
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.
Respuestas:
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.
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
Además de proporcionar un encabezado 404, PHP ahora es responsable de generar la página 404 real.
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.
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.
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 -->
die()
requiere?
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();
}
Desde php 5.4 ahora puedes hacer http_response_code(404);
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.
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.");
}
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
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");
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();
}
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: "".$_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>");
}
Espero que te ayude.
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
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>';