2011-05-10 21 views
14

Tengo una aplicación web que necesita procesar el URI para encontrar si existe una página en una base de datos. No tengo ningún problema dirigiendo la URI de la aplicación con .htaccess:Cómo mostrar la página predeterminada 404 de Apache en PHP

Options +FollowSymlinks 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?p=$1 [NC] 

Mi problema es que si la página no existe, no quiero usar un controlador personalizado 404 escrito en PHP, me gustaría hacer mostrar la página predeterminada de Apache 404. ¿Hay alguna forma de hacer que PHP vuelva a ejecutar manualmente Apache cuando ha determinado que la página no existe?

+0

No realmente. Podría hacer un simple redireccionamiento a través de 'header ('Location: ...')' a la página 404, pero eso se mostraría como una solicitud '200 OK', que se considera una práctica deficiente. –

+1

esto podría ayudarle a: http://stackoverflow.com/questions/4232385/php-or-htaccess-make-dynamic-url-page-to-go-404-when-item-is-missing-in-db –

+0

Creo que todavía no hay una opción fácil para esto, http://stackoverflow.com/q/4856425/345031 – mario

Respuesta

5

La única manera posible Soy consciente de la situación anterior es que este tipo de código php en su index.php:

<?php 
if (pageNotInDatabase) { 
    header('Location: ' . $_SERVER["REQUEST_URI"] . '?notFound=1'); 
    exit; 
} 

Y luego modificar ligeramente su .htaccess así:

Options +FollowSymlinks -MultiViews 
RewriteEngine on 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{QUERY_STRING} !notFound=1 [NC] 
RewriteRule ^(.*)$ index.php?p=$1 [NC,L,QSA] 

De esta forma, Apache mostrará la página predeterminada 404 para este caso especial debido al parámetro de consulta adicional ?notFound=1 agregado desde el código php y con el control negativo para el mismo en la página .htaccess, no se reenviará a index.php la próxima vez.

PS: Un URI como /foo, si no se encuentra en la base de datos se convertirá en /foo?notFound=1 en el navegador.

+0

Esto se repite si se llama esto desde un controlador 404. – Mel

+0

'header ('Ubicación:/no-existente-página-url');' no se suponía que fuera de su controlador 404 personalizado. Ver mi respuesta, escribí index.php arriba. De hecho, no debería tener un controlador 404 personalizado si desea mostrar el controlador 404 de Apache. Sugeriría comentar primero 'ErrorDocument 404' en su configuración de apache o .htaccess. – anubhava

+0

Ah, mi mal. Leyó mal la pregunta original. – Mel

4

llamar a esta función:

http_send_status(404); 
+9

Esto requiere el paquete pecl_http, que es posible que no pueda instalar – andrewtweber

+2

Buena observación. –

+2

buena observación –

14

No creo que se pueda "mano de nuevo" a Apache, pero se puede enviar la cabecera HTTP correspondiente y luego incluir explícitamente el archivo 404 de esta manera:

if (! $exists) { 
    header("HTTP/1.0 404 Not Found"); 
    include_once("404.php"); 
    exit; 
} 

actualización

PHP 5.4 introdujo la función http_response_code que hace esto un poco más fácil de recuer ber.

if (! $exists) { 
    http_response_code(404); 
    include_once("404.php"); 
    exit; 
} 
Cuestiones relacionadas