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


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


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.


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>

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]

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]

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>

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]

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/**"
    ]
  }
}

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


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

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


4
Nie powinieneś publikować tego jako odpowiedzi, jeśli nie masz pewności, czy działa, czy nie.
Czy to ma znaczenie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.