Comment masquer la.extension html avec mod rewrite D'Apache

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

  • l'url /foo récupère le fichier statique /foo.html
  • le navigateur affiche toujours l'url /foo

Le client peut alors envoyer des signets dans le style mydomain.com/foo plutôt que mydomain.com/foo.html .

ça semble très simple, et j'ai utilisé mod_rewrite heureusement avant (disons avec WordPress ou pour les redirections), mais cela s'avère beaucoup plus difficile à craquer que je pensais. Peut-être que je manque quelque chose de vraiment évident, mais je ne peux pas trouver de solution n'importe où et je l'ai été toute la journée!

nous exécutons notre propre serveur, donc cela peut aller partout où est le meilleur endroit.

Addendum

la solution vérifiée ci-dessous a bien fonctionné. Puis, après avoir dirigé le site pendant un certain temps, j'ai remarqué deux problèmes:

  1. toutes les pages ont commencé à apparaître non texturées. J'ai rechargé, vidé le cache, etc. mais toujours pas de style. J'ai déjà eu ce problème, et je ne trouve pas la source.

  2. il y a un répertoire et un fichier html nommé 'gallery', donc le lien /gallery affiche un répertoire au lieu du fichier html. Je devrais être capable de trier celle-là, mais d'autres conseils sont les bienvenus :-)

39
demandé sur Dave Everitt 2010-01-02 20:29:13

7 réponses

essayez cette règle:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]

ceci réécrira toutes les requêtes qui peuvent être mappées vers un fichier existant en ajoutant un .html .

43
répondu Gumbo 2010-01-02 17:31:42

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 originale):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d          # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f     # is an existing html file
RewriteRule ^(.*)$ .html                   # rewrite index to index.html

Pour être SEO friendly et d'éviter la double contenu, de rediriger l' .urls 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$ / [R=301,L]        # redirect from index.html to index

si vous avez besoin de la même chose pour les scripts jeter un oeil ici: comment utiliser .htaccess à cacher .php URL extensions?

28
répondu SailAvid 2017-05-23 12:26:20

la solution acceptée ne fonctionne pas lorsque le site web est configuré avec un hôte virtuel / racine de document.

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]
10
répondu Gael Lafond 2017-02-11 19:02:46

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

Options -MultiViews 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ .php [NC,L]
4
répondu ashpriom 2014-11-17 04:34:17

pour supprimer .html extension de .*.html requêtes, 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 ^(.*?)/?$ .html [NC,L]
3
répondu starkeen 2016-06-24 03:52:28

Voici un exemple qui nous permet de stocker le fichier sur le disque comme:

foo.html.php

mais dans le navigateur, se référer à elle comme

foo.html

pour faire ce travail pour vous, je pense que vous auriez juste besoin de le modifier un peu pour correspondre à vos requêtes existantes, et de vérifier pour un fichier réel en place avec l'extension .html .

 # 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 ^(.*)$ .php',
1
répondu gahooa 2010-01-02 17:32:23

Wow, j'ai rarement vu une telle question pour laquelle il existe autant de "solutions" sur le web, où les gens simplement jeter ce qui "fonctionne", mais peu prennent le temps de lire la documentation pour déterminer ce qu'elle fait. Bon nombre des solutions présentées ici ne fonctionnent pas pour les serveurs virtuels, par exemple.

après beaucoup de références croisées et de lecture, je veux apporter ma propre solution qui "fonctionne pour moi". Espérons que cela fonctionne pour vous, trop. Je n'ai pas le créer à partir de scratch; 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 ^(.*)$ .html [L]

#redirect foo.html to foo
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.+)\.html$  [R,L]

le drapeau [R] par défaut fait une redirection temporaire (302); si vous voulez une redirection permanente, utilisez R=301 à la place de R .

0
répondu Garret Wilson 2016-06-26 23:11:55