2010-03-15 23 views
25

¿Hay alguna manera de servir activamente la página predeterminada de Apache, la página incorporada 404 para un número de URL usando mod_rewrite? No es un documento de error personalizado, pero una regla como¿Redirigir a la página 404 incorporada de Apache con mod_rewrite?

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule -- serve 404 page ----- 

Yo sé cómo construir una página PHP que envía la cabecera 404 y tienen mod_rewrite redirigir todas las URL allí, pero yo preferiría una solución que se basa en mod_rewrite solamente .

sólo tenía la idea de volver a dirigir a una dirección inexistente:

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf 

pero eso sería dar al usuario el mensaje "/ sflkadsölfkasdfölkasdflökasdf no existe" en la página de error, que parece un Poco profesional.

+1

Votante por cerrar: las preguntas de mod_rewrite están oficialmente bien en SO. http://meta.stackexchange.com/questions/39063/mod-rewrite-questions-getting-migrated-to-sf –

+2

+1 buena pregunta! – richsage

Respuesta

39

Usted puede utilizar el indicador R en el RewriteRule para forzar una redirección con un código de estado determinado:

Si bien esto se usa normalmente para redireccionamientos, se puede dar cualquier código de estado válido aquí. Si el código de estado está fuera del rango de redireccionamiento (300-399), la cadena de sustitución se descarta y la reescritura se detiene como si se hubiera utilizado la bandera L.

Así que esto:

RewriteRule ^/?page\.html$ - [R=404] 

devolvería la página por defecto 404 /page.html. Dado que esta es una expresión regular, recuerde el \. de escape y el anclaje $.

-- se ignora (es decir, "la cadena de sustitución se ha caído"), pero todavía debe haber algo allí para mantener la regla bien formada.

+0

Mmm no estoy seguro de si eso desencadenaría la página de error predeterminada, ¿verdad? Porque tendría que ponerle algún valor a 'lo que sea 'y redirigiría ¿no? Aunque puedo estar equivocado, lo probaré e informaré. –

+0

No, como dice la cita, ignora la cadena de sustitución (es decir, "lo que sea" en mi ejemplo). – mercator

+0

@mercator Por supuesto. Lo siento, no lo leí. –

1

Esto debería funcionar:

RewriteEngine on 
RewriteRule ^/page.html /error404.html [L] 

Eso no va a dar la cabecera 404 embargo. Podría intentar cambiar el indicador a [L,R=404] pero dudo que funcione (se supone que es solo para redireccionamientos).

Su idea de hacerlo en PHP funcionaría. Si todos sus "páginas de error" páginas son del lado del servidor (es decir, PHP), entonces solo podría utilizar este código:

<?php 
header('HTTP/1.0 404 Not Found'); 
include 'error404.html'; 
+0

Sí, esto es probablemente con lo que voy a terminar. Sin embargo, tengo curiosidad de saber si hay una forma de desencadenar la página de error incorporada de Apache (sin tener que crearla yo mismo). Algo así como una regla de reescritura "activa el manejo interno de 404 si esta URL coincide". –

10

La mejor manera de hacerlo es establecer la R bandera con el código de estado 404:

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule^- [L,R=404] 

Pero esto sólo está disponible desde Apache 2.

+2

o para mayor claridad, deletélelo como [redirigir = 404]. –

+1

a menudo, NC es otro buen ingrediente. Recuerde que los archivos normales, como la compatibilidad de todos, podrían ser más seguros si RewriteEngine pudiera estar apagado. –

4

confirmo que

RewriteRule^- [L,R=404] 

o

RewriteRule^- [L,redirect=404] 

no funcionará.Aquí está la explicación del sitio oficial de Apache:

Sin embargo, si un código de estado está fuera del rango de redirección (300-399), entonces la cadena de sustitución se deja caer por completo, y la reescritura se detiene como si el L fueron usados.

Así que la mejor solución es redirigir a un archivo 404.php con el encabezado 404 como se explica más adelante.

+0

Gracias. Me preguntaba por qué nunca redirigiría;) –

Cuestiones relacionadas