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.