Jak usunąć .html z adresu URL?

113

Jak usunąć .htmlz adresu URL strony statycznej?

Muszę też przekierować dowolny adres URL z .htmldo adresu bez niego. (czyli www.example.com/page.htmldo www.example.com/page).

Dave
źródło
1
Czy przez „usuń plik .html” masz na myśli „nie wymagaj obecności pliku .html”?
Wyścigi lekkości na orbicie
@Tomalak: Tak, a także przekierowujemy adresy URL z „.html” na te bez. Mój problem polega na tym, że prowadzi to do nieskończonych przekierowań. W mojej obecnej konfiguracji www.example.com/page.html i www.example.com/page są dostępne, co nie jest przyjazne dla SEO.
Dave
@Tomalak: Dzięki za wskazówki. Czytanie dokumentacji mod_rewrite było bardzo pomocne.
Dave

Odpowiedzi:

105

Myślę, że jakieś wyjaśnienie odpowiedzi Jona byłoby konstruktywne. Następujące:

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

sprawdza, czy jeśli określony plik lub katalog nie istnieje, wówczas reguła przepisywania jest kontynuowana:

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

Ale co to znaczy? Używa regex (wyrażeń regularnych) . Oto coś, co zrobiłem wcześniej ... wprowadź opis obrazu tutaj

Myślę , że to prawda.

UWAGA: Podczas testowania .htaccess nie używaj przekierowań 301. Używaj 302 do zakończenia testów, ponieważ przeglądarka będzie buforować 301. Zobacz https://stackoverflow.com/a/9204355/3217306

Aktualizacja: trochę się pomyliłem, .pasuje do wszystkich znaków z wyjątkiem nowych linii, więc zawiera spacje. Również tutaj jest ściągawki pomocny regex

Źródła:

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

binaryfunt
źródło
6
Znakomity diagram, który pomoże wyjaśnić odpowiedź.
Ric
Wskazówka dotycząca 301 i pamięci podręcznej przeglądarki rozwiązała moje problemy.
bgfvdu3w
@KnocksX Nie jestem już webmasterem i nie jestem w stanie pomóc
binaryfunt
84

Aby usunąć rozszerzenie .html ze swoich adresów URL, możesz użyć następującego kodu w katalogu 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]

UWAGA: Jeśli chcesz usunąć jakiekolwiek inne rozszerzenie, na przykład, aby usunąć rozszerzenie .php, po prostu zamień html wszędzie na php w powyższym kodzie.

Amit Verma
źródło
10
Żadna z pozostałych odpowiedzi nie działała dla mnie, ale ta zadziałała, wielkie dzięki!
Emmet Arries
2
ten też pracował dla mnie. Dzięki @starkeen. Oddaj głos ^.
JeremyS
2
Działało doskonale. Dziękuję Ci!
IXany
ten usuwa rozszerzenie pliku za mnie, ale nie przekierowuje na tę stronę
Bhargav Venkatesh
74

Z .htaccess w apache możesz zrobić takie przekierowanie:

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

Jeśli chodzi o usunięcie .html z adresu URL, po prostu umieść link do strony bez .html

<a href="http://www.example.com/page">page</a>
Jon Skarpeteig
źródło
23
To nic dla mnie nie robi. Czy jest jakiś powód, dla którego to nie zadziała?
Michael Yaworski
Czy masz rzeczywisty plik dla żądanego linku? To spowodowałoby!-f
Martijn
72

To powinno działać dla Ciebie:

#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
źródło
3
Otrzymałem 404 w GoDaddy z tym kodem i naprawiłem go, umieszczając: Opcje + FollowSymLinks -MultiViews -Indexes na samej górze.
Labanino
1
Myślę, że to najlepsza i najpełniejsza odpowiedź, dzięki!
ctekk
Próbowałem to zrobić na hoście lokalnym, ale to nie działa, czy muszę zrobić coś jeszcze, czy muszę połączyć plik .htaccess lub jak strona go rozpoznaje?
Pianistprogrammer
Jak dodać rozszerzenie .php do # 301 z example.com/page.html do example.com/page, czy to możliwe?
20

Będziesz musiał się upewnić, że też masz Options -MultiViews.

Żadne z powyższych nie działało dla mnie na standardowym hoście cPanel.

To zadziałało:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]
Bradley Flood
źródło
Ze wszystkich powyższych odpowiedzi ta w końcu zadziałała. Myślę, że moja witryna jest hostowana na GoDaddy z cPanel. Kluczem są opcje -MultiViews
Brad Vanderbush
Tak, nic w tej sekcji nie działa, oczekując takiej odpowiedzi! Uratowałeś dzień!
Neil Bannet
Dzięki stary. Nie jestem pewien, dlaczego inne nie wyszły zgodnie z oczekiwaniami.
Nanoo
13

Dziękuję za twoje odpowiedzi. Już rozwiązałem swój problem. Załóżmy, że mam swoje strony pod adresem http://www.yoursite.com/html , obowiązują następujące zasady .htaccess .

<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
źródło
6

Używam tego pliku .htacess do usuwania rozszerzenia .html z mojej witryny url, sprawdź, czy jest to poprawny kod:

    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
źródło
Wydawało mi się, że to zadziałało, w przeciwieństwie do innych przedstawionych tutaj rozwiązań, dziękuję. Chciałbym jednak dodać, że nadal musisz zaktualizować łącza w swoim HTML (więc jeśli pierwotnie tworzysz linki do pliku .html jako <a href="page1.html"> </a>, powinieneś zaktualizować jako <a href=" example.com/page1"> </ a > i wtedy będzie działać.)
Lorenzo
Podstawową zmianą dla mnie był RewriteBase /kawałek. Niestety nie rozumiem, dlaczego to zadziałało, ale myślę, że wkrótce się nauczę.
Keno Clayton,
4

Dla tych, którzy korzystają z hostingu Firebase, żadna z odpowiedzi nie będzie działać na tej stronie. Ponieważ nie możesz korzystać .htaccessz hostingu Firebase. Będziesz musiał skonfigurować plik firebase.json. Po prostu dodaj linię "cleanUrls": truedo swojego pliku i zapisz ją. Otóż ​​to.

Po dodaniu linii firebase.json będzie wyglądać następująco:

{
  "hosting": {
    "public": "public",
    "cleanUrls": true, 
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
Szorstki
źródło
2

Aby usunąć rozszerzenie .html ze swoich adresów URL, możesz użyć następującego kodu w katalogu 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]

Dzięki

Akash Limbani
źródło
-1
RewriteRule /(.+)(\.html)$ /$1 [R=301,L] 

Spróbuj tego :) nie wiem, czy to działa.

Jarsäter
źródło
4
Nie powinieneś publikować tego jako odpowiedzi, jeśli nie masz pewności, czy działa, czy nie.
Czy to ma znaczenie