Comment supprimer .html de l'URL?


112

Comment supprimer .htmlde l'URL d'une page statique?

De plus, j'ai besoin de rediriger n'importe quelle URL avec .htmlvers celle qui n'en a pas. (c'est- www.example.com/page.htmlà- dire à www.example.com/page).


1
Par "supprimer .html", voulez-vous dire "ne pas exiger que le .html soit présent"?
Courses de légèreté en orbite le

@Tomalak: Oui et redirige également les URL avec ".html" vers celles sans. Mon problème est que cela entraîne une redirection infinie. Ma configuration actuelle permet à www.example.com/page.html et www.example.com/page d'être tous les deux accessibles, ce qui n'est pas convivial pour le référencement.
Dave


@Tomalak: Merci pour les conseils. La lecture de la documentation de mod_rewrite a été très utile.
Dave

Réponses:


105

Je pense qu'une explication de la réponse de Jon serait constructive. Le suivant:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

vérifie que si le fichier ou le répertoire spécifié n'existe pas respectivement, la règle de réécriture se poursuit:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

Mais qu'est ce que ça veut dire? Il utilise des regex (expressions régulières) . Voici un petit quelque chose que j'ai fait plus tôt ... entrez la description de l'image ici

Je pense que c'est correct.

REMARQUE: lors du test, .htaccess n'utilisez pas les redirections 301. Utilisez 302 jusqu'à la fin du test, car le navigateur mettra 301 en cache. Voir https://stackoverflow.com/a/9204355/3217306

Mettre à jour: je me suis légèrement trompé, .correspond à tous les caractères sauf les retours à la ligne, donc inclut les espaces. Aussi, voici une feuille de triche utile pour les regex

Sources:

http://community.sitepoint.com/t/what-does-this-mean-rewritecond-request-filename-fd/2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess-rewrite-rules


6
Superbe diagramme pour aider à expliquer la réponse.
Ric

Le conseil sur les 301 et le cache du navigateur est ce qui a résolu mes problèmes.
bgfvdu3w

@KnocksX Je ne suis plus un webmaster et je ne suis pas en mesure de pouvoir aider
binaryfunt

84

Pour supprimer l'extension .html de vos URL, vous pouvez utiliser le code suivant dans root / htaccess:

RewriteEngine on


RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

REMARQUE: Si vous souhaitez supprimer une autre extension, par exemple pour supprimer l'extension .php, remplacez simplement le html partout par php dans le code ci-dessus.


10
Aucune des autres réponses n'a fonctionné pour moi, mais celle-ci a fonctionné, merci beaucoup!
Emmet Arries

2
celui-ci a également fonctionné pour moi. Merci @starkeen. Avoir un vote.
JeremyS

2
A parfaitement fonctionné. Je vous remercie!
ixany

celui-ci supprime l'extension de fichier pour moi mais ne redirige pas vers cette page
Bhargav Venkatesh

74

Avec .htaccess sous apache, vous pouvez faire la redirection comme ceci:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.html$ /$1 [L,R=301] 

Quant à la suppression du .html de l'url, il suffit de créer un lien vers la page sans .html

<a href="http://www.example.com/page">page</a>

23
Cela ne fait rien pour moi. Y a-t-il une raison pour laquelle cela ne fonctionnerait pas?
Michael Yaworski

Avez-vous un fichier réel pour le lien demandé? Cela déclencherait le!-f
Martijn

72

Cela devrait fonctionner pour vous:

#example.com/page will display the contents of example.com/page.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]

#301 from example.com/page.html to example.com/page
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]

3
J'avais un 404 dans Godaddy avec ce code et je l'ai corrigé en mettant: Options + FollowSymLinks -MultiViews -Indexes tout en haut.
Labanino

1
Je pense que c'est la meilleure et la plus complète réponse, merci!
ctekk

J'ai essayé de le faire dans localhost, mais cela ne fonctionne pas, y a-t-il autre chose à faire, dois-je lier le fichier .htaccess ou comment la page le reconnaît-elle?
Pianistprogrammer

Comment puis-je ajouter l'extension .php à # 301 depuis example.com/page.html vers example.com/page, est-ce possible?

20

Vous devrez vous assurer que vous l'avez Options -MultiViewségalement.

Rien de ce qui précède n'a fonctionné pour moi sur un hôte cPanel standard.

Cela a fonctionné:

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

Sur toutes les réponses ci-dessus, celle-ci a finalement fonctionné .. Je crois que mon site est hébergé sur godaddy avec cPanel. La clé est Options -MultiViews
Brad Vanderbush

Oui, rien dans cette section ne fonctionne, attendez-vous à cette réponse! Vous avez sauvé la journée!
Neil Bannet

Merci mon pote. Je ne sais pas pourquoi les autres n'ont pas fonctionné comme prévu.
Nanoo

13

Merci pour vos réponses. J'ai déjà résolu mon problème. Supposons que mes pages soient sous http://www.votresite.com/html , les règles .htaccess suivantes s'appliquent.

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*).html\ HTTP/
   RewriteRule .* http://localhost/html/%1 [R=301,L]

   RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /html/(.*)\ HTTP/
   RewriteRule .* %1.html [L]
</IfModule>

6

J'utilise ce .htacess pour supprimer l'extantion .html de mon site URL, veuillez vérifier que le code est correct:

    RewriteEngine on
RewriteBase /
RewriteCond %{http://www.proofers.co.uk/new} !(\.[^./]+)$
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule (.*) /$1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+)\.html\ HTTP
RewriteRule ^([^.]+)\.html$ http://www.proofers.co.uk/new/$1 [R=301,L]

Cela a semblé fonctionner pour moi, contrairement aux autres solutions présentées ici, merci. J'ajouterais cependant que vous devez toujours mettre à jour le (s) lien (s) dans votre HTML (donc si vous créez à l'origine un lien vers votre fichier .html en tant que <a href="page1.html"> </a>, vous devez mettre à jour comme <a href=" example.com/page1"> </ a > et ensuite cela fonctionnera.)
Lorenzo

Le changement fondamental pour moi était le RewriteBase /peu. Malheureusement, je ne comprends pas pourquoi cela a fonctionné, mais je suppose que je l'apprendrai bientôt.
Keno Clayton

4

Pour ceux qui utilisent l'hébergement Firebase, aucune des réponses ne fonctionnera sur cette page. Parce que vous ne pouvez pas utiliser .htaccessdans l'hébergement Firebase. Vous devrez configurer le fichier firebase.json. Ajoutez simplement la ligne"cleanUrls": true dans votre fichier et enregistrez-le. C'est tout.

Après avoir ajouté la ligne firebase.json ressemblera à ceci:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}

2

Pour supprimer l'extension .html de vos URL, vous pouvez utiliser le code suivant dans root / htaccess:

#mode_rerwrite start here

RewriteEngine On

# does not apply to existing directores, meaning that if the folder exists on server then don't change anything and don't run the rule.

RewriteCond %{REQUEST_FILENAME} !-d

#Check for file in directory with .html extension 

RewriteCond %{REQUEST_FILENAME}\.html !-f

#Here we actually show the page that has .html extension

RewriteRule ^(.*)$ $1.html [NC,L]

Merci


-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

Essayez ceci :) je ne sais pas si cela fonctionne.


4
Vous ne devriez pas l'afficher comme réponse si vous ne savez pas si cela fonctionne ou non.
Ça compte le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.