J'ai un petit nombre de sites statiques où je veux simplement masquer l'extension .html:
/foo
récupère le fichier statique /foo.html
/foo
Le client peut ensuite envoyer des signets dans le style mydomain.com/foo
plutôt que mydomain.com/foo.html
.
Cela semble très simple, et j'ai utilisé mod_rewrite
heureusement avant (par exemple avec WordPress ou pour les redirections), mais cela s'avère beaucoup plus difficile à résoudre que je le pensais. Peut-être que je manque quelque chose de vraiment évident, mais je ne trouve pas de solution partout et j'y ai été toute la journée!
Nous gérons notre propre serveur, cela peut donc aller partout où est le meilleur endroit.
Addendum
La solution vérifiée ci-dessous a bien fonctionné. Puis après avoir exécuté le site pendant un certain temps, j'ai remarqué deux problèmes:
toutes les pages ont commencé à apparaître sans style. J'ai rechargé, vidé le cache, etc., mais toujours sans style. J'ai déjà rencontré ce problème et je n'arrive pas à localiser la source.
Il y a un répertoire ET un fichier html nommé 'galerie', donc le lien/gallery affiche une liste de répertoires au lieu du fichier html. Je devrais pouvoir trier celui-ci, mais d'autres conseils sont les bienvenus :-)
Essayez cette règle:
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
Cela réécrira toutes les demandes qui peuvent être mappées sur un fichier existant lors de l'ajout d'un .html
.
Les réponses précédentes ne vérifient pas si le chemin demandé est un répertoire.
Voici la condition de réécriture complète qui ne réécrit pas, si le chemin demandé est un répertoire (comme indiqué par la question d'origine):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file
RewriteRule ^(.*)$ $1.html # rewrite index to index.html
Pour être optimisé pour le référencement et éviter le double contenu, redirigez les URL .html:
# Redirects domain.com/file.html to domain.com/file
RewriteCond %{REQUEST_FILENAME} !-d # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f # is an existing html file
RewriteCond %{REQUEST_URI} ^(.+)\.html$ # request URI ends with .html
RewriteRule (.*)\.html$ /$1 [R=301,L] # redirect from index.html to index
Si vous en avez besoin pour les scripts, jetez un œil ici: Comment puis-je utiliser .htaccess pour masquer les extensions d'URL .php?
La solution acceptée ne fonctionne pas lorsque le site Web est configuré avec une racine d'hôte/document virtuelle.
Il y a la solution que j'ai utilisée:
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
Regardez ce post http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess/ Je ne l'ai pas encore essayé mais la démonstration semble assez convaincant.
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Retirer .html
extension de .*.html
demandes, vous pouvez utiliser le script suivant dans root/.htaccess
:
RewriteEngine On
RewriteBase /
#1) externally redirect "/file.html" to "/file"
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R=301,L]
#2) rewrite "/file" back to "/file.html"
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*?)/?$ $1.html [NC,L]
Voici un exemple qui nous permet de stocker le fichier sur disque en tant que:
foo.html.php
Mais dans le navigateur, appelez-le
foo.html
Pour que cela fonctionne pour vous, je pense que vous auriez juste besoin de le modifier un peu pour qu'il corresponde à vos demandes existantes et de rechercher un fichier réel en place avec le .html
extension.
# These are so we do not need the .php extension
RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$',
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f',
RewriteRule ^(.*)$ $1.php',
Wow, j'ai rarement vu un tel problème pour lequel il existe tant de "solutions" sur le Web, où les gens lancent simplement ce qui "fonctionne pour eux" mais pour lesquels peu prennent le temps de lire la documentation pour comprendre ce qu'il fait. La plupart des solutions présentées ici ne fonctionnent pas pour les hôtes virtuels, par exemple.
Après de nombreux recoupements et lectures, je souhaite apporter ma propre solution qui "fonctionne pour moi". Espérons que cela fonctionne aussi pour vous. Je ne l'ai pas créé à partir de zéro; J'ai été inspiré par toutes les autres contributions (même si la plupart d'entre elles n'ont pas "travaillé pour moi" sans modification).
RewriteEngine on
#if foo requested, return foo.html contents
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f
RewriteRule ^(.*)$ $1.html [L]
#redirect foo.html to foo
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.+)\.html$ $1 [R,L]
Le [R]
flag par défaut effectue une redirection temporaire (302); si vous voulez une redirection permanente, utilisez R=301
à la place de R
.