Tengo una página de error 404 personalizada y una regla mod_rewrite. Si accedo a una página que no existe, obtengo mi página de error 404. Mi problema es que si emito un encabezado 404 desde mi página php, no abre mi página 404, en cambio, obtengo esto:

Not Found

The requested URL /index.php was not found on this server.

Additionally, a 404 Not Found error was encountered while trying
to use an ErrorDocument to handle the request.

Este es mi .htaccess:

RewriteEngine on
ErrorDocument 404 /errors/404.php
RewriteRule ^[A-Za-z0-9]{8}/$ /index.php

Esta es mi redirección desde /index.php que se 404 solo si la clave no existe. La clave $ se obtiene al analizar la URL (por ejemplo, http: // localhost / aKeYCoDE /):

<?php
if (!key_exists($key)){
    header('HTTP/1.0 404 Not Found');
    exit;
}
?>

Espero que se redirija a mi página 404.

Actualizar:

Es definitivamente algo sobre el hecho de que estoy llamando al 404 desde una página que fue reescrita (/index.php). Si creo una página ficticia: /redirect.php, y luego no hago nada más que emitir el 404 desde allí, obtengo mi página 404 personalizada. Pero, si escribo una regla mod_rewrite para él e intento acceder a él de esa manera, obtengo la página de error 404 predeterminada.

2
Blazes 25 sep. 2011 a las 20:46
Parece que no puede encontrar su 404.php. ¿Estás seguro de que existe? También puede probar la ruta URL completa al archivo.
 – 
c..
25 sep. 2011 a las 21:40
El /errors/404.php definitivamente existe. Puedo acceder a él directamente y lo obtengo si accedo a un archivo que no existe. Lo que no entiendo es que si hago un redireccionamiento 404 desde mi página php (/index.php que fue reescrito), obtengo la página de error predeterminada, no la mía.
 – 
Blazes
25 sep. 2011 a las 21:45
Estoy de acuerdo con su respuesta dada a continuación (responder con un estado 404 de PHP no activará su Apache ErrorDocument). Sin embargo, la actualización de su pregunta parece contradecir esto ... "Si creo una página ficticia: /redirect.php, y luego no hago nada más que emitir el 404 desde allí, obtengo mi página 404 personalizada". ?
 – 
MrWhite
15 dic. 2013 a las 20:10

1 respuesta

La mejor respuesta

Encontré la respuesta: el problema era mi suposición de que un encabezado 404 de php redirigiría a una página 404. Eso estuvo mal. El servidor Apache puede emitir 404 para páginas que no existen, pero para páginas que sí existen, es decir, están siendo atendidas por la página php, la respuesta 404 va al navegador.

Este hilo fue de un problema similar: http://www.webmasterworld.com/forum88/10955.htm

Para hacer que php haga lo que quiero que haga (emita el 404 cuando la clave no existe), necesito incluir la página 404 de php:

<?php
if (!key_exists($key)){
    include($_SERVER["DOCUMENT_ROOT"]."/errors/404.php");
    exit;
}
?>
2
Blazes 25 sep. 2011 a las 23:22