web-dev-qa-db-fra.com

Rediriger vers la page 404 intégrée à Apache avec mod_rewrite?

Existe-t-il un moyen de servir activement Apache par défaut, page 404 intégrée pour un certain nombre d'URL en utilisant mod_rewrite? Pas un document d'erreur personnalisé, mais une règle comme

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

Je sais comment construire une page PHP qui envoie l'en-tête 404 et a mod_rewrite redirige toutes les URL, mais je préférerais une solution basée sur mod_rewrite seulement.

Je viens d'avoir l'idée de rediriger vers une adresse inexistante:

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

mais cela donnerait à l'utilisateur le message "//sflkadsölfkasdfölkasdflökasdf n'existe pas" sur la page d'erreur, qui semble un peu peu professionnelle.

31
Pekka 웃

Vous pouvez utiliser l'indicateur R sur RewriteRule pour forcer une redirection avec un code d'état donné:

Bien que cela soit généralement utilisé pour les redirections, tout code d'état valide peut être donné ici. Si le code d'état est en dehors de la plage de redirection (300-399), la chaîne de substitution est supprimée et la réécriture est arrêtée comme si l'indicateur L était utilisé.

Donc ça:

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

retournerait la page 404 par défaut pour /page.html. Puisqu'il s'agit d'une expression rationnelle, souvenez-vous de l'échappement \. et ancrage $.

- est ignoré (c'est-à-dire "la chaîne de substitution est supprimée"), mais il doit encore y avoir quelque chose pour garder la règle bien formée.

47
mercator

La meilleure façon de le faire est de définir l'indicateur R avec le code d'état 404:

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

Mais cela n'est disponible que depuis Apache 2.

11
Gumbo

Je confirme que

RewriteRule ^ - [L,R=404]

ou

RewriteRule ^ - [L,redirect=404]

ne fonctionnera pas. Voici l'explication du site officiel d'Apache:

Cependant, si un code d'état est en dehors de la plage de redirection (300-399), la chaîne de substitution est entièrement supprimée et la réécriture est arrêtée comme si le L était utilisé.

La meilleure solution consiste donc à rediriger vers un fichier 404.php avec l'en-tête 404 comme expliqué plus loin.

5
Max

Cela devrait fonctionner:

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

Cela ne donnera cependant pas l'en-tête 404. Vous pouvez essayer de changer pour signaler à [L,R=404] mais je doute que cela fonctionne (c'est censé être pour les redirections uniquement).

Votre idée de le faire dans PHP fonctionnerait. Si toutes vos pages "pages d'erreur" sont côté serveur (c'est-à-dire PHP), vous pouvez simplement utiliser ce code:

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