web-dev-qa-db-fra.com

Comment masquer l'extension .html avec Apache mod_rewrite

J'ai un petit nombre de sites statiques où je veux simplement masquer l'extension .html:

  • l'url /foo récupère le fichier statique /foo.html
  • le navigateur affiche toujours l'url /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:

  1. 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.

  2. 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 :-)

41
Dave Everitt

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.

48
Gumbo

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?

33
Stefan Profanter

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]
12
Gael Lafond

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]
4
Syed Priom

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]
3
starkeen

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',
1
gahooa

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.

1
Garret Wilson