Apache Rewrite urls – supprimer .html et retourner 404 si .html est présent

J’ajoute un répertoire à un site Web qui est servi avec Apache 2 que je souhaite supprimer l’extension .html des demandes entrantes. Dans / new-directory, j’ai un fichier .htaccess contenant:

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.html [NC,L] 

Donc avec cette règle / new-directory / page fonctionne, mais /new-directory/page.html fonctionne aussi, ce que je ne veux pas. Je souhaite que toutes les pages des nouveaux répertoires / et sous-répertoires ne diffusent que des pages sans .html, et renvoient un 404 introuvable si une requête page.html apparaît.

Ce sont de nouvelles pages, donc je ne me soucie pas de les redirect.

Edit: oublié de mentionner qu’il n’y a qu’un seul fichier dans / new-directory (/ new-directory / dhandler) – un script Perl qui parsing l’URL entrante s’il y a une entrée de firebase database correspondante. Il n’y a pas de fichiers à associer pour que je puisse supprimer cette condition.

J’ai compris que je n’avais pas expliqué qu’il n’y avait qu’un seul gestionnaire de fichiers par défaut dans / new-directory, ce qui entraînait une certaine confusion, voir edit ci-dessus.

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.html [NC,L] RewriteCond %{THE_REQUEST} .*\.html[\s\?]{1} RewriteRule .*\.html$ - [R=404,L] 

Ce qui m’a gâché, c’est que parfois ces URL ont des chaînes de requête, donc je dois vérifier à la fois l’espace et? faire correspondre .html dans% {THE_REQUEST}.

EDIT: Si quelqu’un a des fichiers .html réels dans un répertoire (au lieu d’un fichier qui gère dynamicment toutes les requêtes comme moi), il devrait probablement append:

 RewriteCond %{REQUEST_FILENAME} -f 

juste après ‘RewriteEngine On’ Pour vous assurer que la requête entrante correspond à un fichier existant dans / new-directory.

Pour ce faire, vous avez besoin de quelques règles:

 RewriteBase / RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule (.*) $1.html [NC,L] RewriteCond %{THE_REQUEST} .*\.html\s RewriteRule .*\.html$ - [R=404,L] 

Le premier vérifie qu’il existe un fichier HTML correspondant à la requête. Si c’est le cas, la demande sera réécrite en interne.

La seconde règle redirige tout ce qui se termine par .html vers un 404 introuvable.

Placez ce code dans /new-directory/.htaccess :

 RewriteEngine On RewriteBase /new-directory/ RewriteCond %{THE_REQUEST} /(?:index)?(.*?)\.html[\s?] [NC] RewriteRule ^ %1 [R=301,L,NE] RewriteCond %{REQUEST_FILENAME} !-d #RewriteCond %{DOCUMENT_ROOT}/new-directory/$1\.html -f [NC] RewriteRule ^(.+?)/?$ $1.html [L]