2017-10-20 42 views
0

J'ai un site web statique avec des fichiers html et je veux les appeler sans la fin .html et une barre oblique..htaccess supprime l'extension .html et ajoute le slash de fin et interdit les fichiers .html

Par exemple:

www.test.com/test.html 

devrait être disponible sous

www.test.com/test/ 

Je géré cela avec les éléments suivants .htaccess

Options -Multiviews 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^([^\.]+)/$ $1.html 

Mais les deux versions du plomb URL au même page. Comment puis-je rediriger (sans .html) ou lancer un 404 pour la version .html?

www.test.com/test.html 

Ceci est la solution de travail avec un slash final. Merci @arkascha!

Options -Multiviews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^([^\.]+)/$ $1.html [END] 

Répondre

0

Eh bien, ajouter une autre règle qui redirige explicitement les requêtes vers des URL avec « extensions de nom de fichier » ...

Options -Multiviews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^/?([^\.]+)/?$ /$1.html [END] 

Si les résultats de l'ensemble de règles ci-dessus dans un état http 500 ("serveur d'erreur interne "), il y a de fortes chances que vous utilisiez une version très ancienne du serveur Apache http. Dans ce cas, vous devez utiliser le drapeau L au lieu du drapeau END et ajouter une condition supplémentaire au premier bloc:

RewriteEngine On 

RewriteCond %{REQUEST_URI} .html$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1/ [R=301] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^/?([^\.]+)/?$ /$1.html [L] 

Et un soupçon général: vous devez toujours préférer placer ces règles à l'intérieur du Configuration de l'hôte des serveurs http (virtuels) au lieu d'utiliser des fichiers de configuration dynamiques (fichiers de style .htaccess). Ces fichiers sont notoirement sujettes aux erreurs, difficiles à déboguer et ils ralentissent vraiment le serveur. Ils sont seulement supportés comme une dernière option pour les situations où vous n'avez pas de contrôle sur la configuration de l'hôte (lisez: les fournisseurs de services d'hébergement vraiment bon marché) ou si vous avez une application qui repose sur l'écriture de ses propres règles de réécriture).

+0

J'ai déjà essayé. Cela ne fonctionne pas car il se termine par une boucle infinie. (5ème ligne la barre oblique est manquante: RewriteRule^/? (. +) \. Html $/$ 1/[R = 301]) –

+0

Je ne vois pas comment l'ensemble de règles ci-dessus devrait se terminer par une boucle de réécriture sans fin. Bien sûr, vous n'avez pas essayé quelque chose de similaire? A propos de cette barre oblique: il est rare d'ajouter une barre oblique, c'est pourquoi je l'ai omise ... – arkascha

+0

J'ai copié votre code 1: 1 et google chrome se termine par un ERR_TOO_MANY_REDIRECTS. Je l'ai essayé avec différents navigateurs et ordinateurs. Essayez-le vous-même, vous aurez le même problème. –