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:
-
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.
-
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 :-)
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
.
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?
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]
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]
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]
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',
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
.