Wie entferne ich .html von der URL?

112

Wie entferne ich .htmlvon der URL einer statischen Seite?

Außerdem muss ich jede URL mit .htmlzu der ohne umleiten . (dh www.example.com/page.htmlzu www.example.com/page).

Dave
quelle
1
Mit ".html entfernen" meinen Sie "keine .html muss vorhanden sein"?
Leichtigkeitsrennen im Orbit
@Tomalak: Ja und auch URLs mit ".html" an diejenigen ohne weiterleiten. Mein Problem ist, dass dies zu einer unendlichen Umleitung führt. Mein aktuelles Setup ermöglicht den Zugriff auf www.example.com/page.html und www.example.com/page, was nicht SEO-freundlich ist.
Dave
@Tomalak: Danke für die Tipps. Das Lesen der Dokumentation von mod_rewrite war sehr hilfreich.
Dave

Antworten:

105

Ich denke, eine Erklärung von Jons Antwort wäre konstruktiv. Folgende:

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

Überprüft, ob die Umschreiberegel fortgesetzt wird, wenn die angegebene Datei bzw. das angegebene Verzeichnis nicht vorhanden ist:

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

Aber was heißt das? Es verwendet Regex (reguläre Ausdrücke) . Hier ist etwas, das ich früher gemacht habe ... Geben Sie hier die Bildbeschreibung ein

Ich denke das ist richtig.

HINWEIS: Verwenden Sie beim Testen .htaccess keine 301-Weiterleitungen. Verwenden Sie 302, bis der Test abgeschlossen ist, da der Browser 301s zwischenspeichert. Siehe https://stackoverflow.com/a/9204355/3217306

Update: Ich habe mich leicht geirrt, .stimmt mit allen Zeichen außer Zeilenumbrüchen überein, enthält also Leerzeichen. Auch hier ist eine hilfreiche regex Spickzettel

Quellen:

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

Binärfunt
quelle
6
Hervorragendes Diagramm zur Erklärung der Antwort.
Ric
Der Tipp zu den 301s und zum Browser-Cache hat meine Probleme gelöst.
bgfvdu3w
@ KnocksX Ich bin kein Webmaster mehr und bin nicht in der Lage zu helfen
binaryfunt
84

Um die Erweiterung .html aus Ihren URLs zu entfernen, können Sie den folgenden Code in root / htaccess verwenden:

RewriteEngine on


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

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

HINWEIS: Wenn Sie eine andere Erweiterung entfernen möchten, z. B. um die .php-Erweiterung zu entfernen, ersetzen Sie einfach den HTML- Code überall durch PHP im obigen Code.

Amit Verma
quelle
10
Keine der anderen Antworten hat bei mir funktioniert, aber diese hat funktioniert, vielen Dank!
Emmet Arries
2
Dieser hat auch für mich gearbeitet. Danke @starkeen. Habe eine Stimme.
JeremyS
2
Hat einwandfrei funktioniert. Danke dir!
Ixany
Dieser entfernt die Dateierweiterung für mich, leitet sie jedoch nicht zu dieser Seite weiter
Bhargav Venkatesh
74

Mit .htaccess unter Apache können Sie die Umleitung folgendermaßen durchführen:

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

Wenn Sie .html aus der URL entfernen möchten, verlinken Sie einfach auf die Seite ohne .html

<a href="http://www.example.com/page">page</a>
Jon Skarpeteig
quelle
23
Das tut nichts für mich. Gibt es einen Grund, warum es nicht funktionieren würde?
Michael Yaworski
Haben Sie eine aktuelle Datei für den angeforderten Link? Das würde den!-f
Martijn
72

Dies sollte für Sie funktionieren:

#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]
Łukasz Habrzyk
quelle
3
Ich habe in Godaddy eine 404 mit diesem Code bekommen und das Problem behoben: Optionen + FollowSymLinks -MultiViews -Indexe ganz oben.
Labanino
1
Ich denke, das ist die beste und vollständigste Antwort, danke!
Ctekk
Ich habe versucht, dies in localhost zu tun, aber es funktioniert nicht. Muss ich noch etwas tun, muss ich die .htaccess-Datei verknüpfen oder wie erkennt die Seite sie?
Pianistprogrammer
Wie füge ich # 301 die Erweiterung .php von example.com/page.html zu example.com/page hinzu? Ist das möglich?
20

Sie müssen sicherstellen, dass Sie auch haben Options -MultiViews.

Keiner der oben genannten Punkte funktionierte für mich auf einem Standard-cPanel-Host.

Das hat funktioniert:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Bradley Flood
quelle
Von allen Antworten oben hat diese endlich funktioniert. Ich glaube, weil meine Seite auf Godaddy mit cPanel gehostet wird. Der Schlüssel ist Options -MultiViews
Brad Vanderbush
Ja, nichts in diesem Abschnitt funktioniert erwartet diese Antwort! Du hast den Tag gerettet!
Neil Bannet
Danke Kumpel. Ich bin mir nicht sicher, warum die anderen nicht wie erwartet geklappt haben.
Nanoo
13

Vielen Dank für Ihre Antworten. Ich habe mein Problem bereits gelöst. Angenommen, ich habe meine Seiten unter http://www.yoursite.com/html . Es gelten die folgenden .htaccess- Regeln.

<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>
Dave
quelle
6

Ich verwende diese .htacess, um die .html-Erweiterung von meiner URL-Site zu entfernen. Bitte überprüfen Sie, ob dies der richtige Code ist:

    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]
Anmol
quelle
Dies schien für mich im Gegensatz zu den anderen hier vorgestellten Lösungen zu funktionieren, danke. Ich möchte jedoch hinzufügen, dass Sie die Links in Ihrem HTML-Code noch aktualisieren müssen. Wenn Sie also ursprünglich als <a href="page1.html"> </a> auf Ihre HTML-Datei verlinken, sollten Sie diese aktualisieren es als <a href=" example.com/page1"> </ a > und dann wird es funktionieren.)
Lorenzo
Die Kernveränderung für mich war das RewriteBase /bisschen. Leider verstehe ich nicht, warum es funktioniert hat, aber ich denke, ich werde es bald lernen.
Keno Clayton
4

Für diejenigen, die Firebase-Hosting verwenden, funktioniert keine der Antworten auf dieser Seite. Weil Sie nicht .htaccessin Firebase-Hosting verwenden können. Sie müssen die Datei firebase.json konfigurieren. Fügen Sie einfach die Zeile "cleanUrls": truein Ihre Datei ein und speichern Sie sie. Das ist es.

Nach dem Hinzufügen der Zeile wird firebase.json folgendermaßen aussehen:

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

Um die Erweiterung .html aus Ihren URLs zu entfernen, können Sie den folgenden Code in root / htaccess verwenden:

#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]

Vielen Dank

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

Versuchen Sie dies :) Ich weiß nicht, ob es funktioniert.

Jarsäter
quelle
4
Sie sollten es nicht als Antwort veröffentlichen, wenn Sie nicht sicher sind, ob es funktioniert oder nicht.
Ist es wichtig,