Jak ukryć ... rozszerzenie html z Apache mod rewrite

Mam małą liczbę statycznych stron, gdzie po prostu chcę ukryć .rozszerzenie html:

  • url /foo pobiera plik statyczny /foo.html
  • przeglądarka nadal wyświetla adres url /foo

Klient może następnie wysyłać zakładki w stylu mydomain.com/foo, a nie mydomain.com/foo.html.

Brzmi bardzo prosto, a ja używałem mod_rewrite szczęśliwie wcześniej( powiedzmy z WordPressem lub przekierowaniami), ale okazuje się to znacznie trudniejsze do złamania, że myślałem. Być może brakuje mi coś naprawdę oczywistego, ale nigdzie nie mogę znaleźć rozwiązania i siedzę nad tym cały dzień!

Prowadzimy własny serwer, więc może to pójść gdzie jest najlepsze miejsce.

Dodatek

Sprawdzony poniżej roztwór działał dobrze. Potem po uruchomieniu strony zauważyłem dwa problemy:

  1. Wszystkie strony zaczęły pojawiać się nieczytelne. Przeładowałem, wyczyściłem pamięć podręczną itp., ale nadal bez stylu. Miałem już taki problem i nie mogę zlokalizować źródło.

  2. Istnieje katalog i plik html o nazwie 'gallery' , więc link / gallery pokazuje listę katalogów zamiast pliku html. Powinienem być w stanie to uporządkować, ale dalsze wskazówki mile widziane :-)

Author: Dave Everitt, 2010-01-02

7 answers

Wypróbuj tę zasadę:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]

Spowoduje to przepisanie wszystkich żądań, które można zmapować do istniejącego pliku podczas dodawania .html.

 43
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-02 17:31:42

Poprzednie odpowiedzi nie sprawdzają, czy żądana ścieżka jest katalogiem.

Oto pełny warunek przepisywania, który nie przepisuje, jeśli żądana ścieżka jest katalogiem (jak podano w pytaniu oryginalnym):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d          # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f     # is an existing html file
RewriteRule ^(.*)$ $1.html                   # rewrite index to index.html

Aby być SEO friendly i uniknąć podwójnych treści, przekieruj .URL html:

# Redirects domain.com/file.html to domain.com/file
RewriteCond %{REQUEST_FILENAME} !-d          # is not directory
RewriteCond %{REQUEST_FILENAME}\.html -f     # is an existing html file
RewriteCond %{REQUEST_URI} ^(.+)\.html$      # request URI ends with .html
RewriteRule (.*)\.html$ /$1 [R=301,L]        # redirect from index.html to index

Jeśli potrzebujesz tego samego do skryptów zajrzyj tutaj: Jak mogę używać .htaccess do ukrycia .php URL extensions?

 28
Author: SailAvid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:20

Zaakceptowane rozwiązanie nie działa, gdy strona internetowa jest skonfigurowana z wirtualnym hostem / głównym dokumentem.

Jest rozwiązanie, którego użyłem:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [L]
 10
Author: Gael Lafond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-11 19:02:46

Spójrz na ten post http://alexcican.com/post/how-to-remove-php-html-htm-extensions-with-htaccess / jeszcze nie próbowałem, ale demonstracja wydaje się dość przekonująca.

Options -MultiViews 
RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.php [NC,L]
 4
Author: ashpriom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-17 04:34:17

Aby usunąć rozszerzenie .html z zapytań .*.html, możesz użyć następującego skryptu w root/.htaccess:

RewriteEngine On
RewriteBase /
#1) externally redirect "/file.html" to "/file"
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.html [NC]
RewriteRule ^ %1 [R=301,L]
#2) rewrite  "/file" back to "/file.html"
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*?)/?$ $1.html [NC,L]
 3
Author: starkeen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 03:52:28

Oto przykład, który pozwala nam zapisać plik na dysku jako:

foo.html.php

Ale w przeglądarce nazywaj ją

foo.html

Aby to działało dla ciebie, myślę, że po prostu musisz zmodyfikować go trochę, aby dopasować je do istniejących żądań i sprawdzić, czy istnieje prawdziwy Plik z rozszerzeniem .html.

 # These are so we do not need the .php extension
 RewriteCond %{REQUEST_FILENAME} (\.xul|\.html|\.xhtml|\.xml)$',
 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f',
 RewriteRule ^(.*)$ $1.php',
 1
Author: gahooa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-02 17:32:23

Wow, rzadko widziałem taki problem, dla którego istnieje tak wiele " rozwiązań "w Internecie, gdzie ludzie po prostu wymiotować, co" działa dla nich", ale dla których niewielu zajmuje czas, aby przeczytać dokumentację, aby dowiedzieć się, co to robi. Wiele z podanych tutaj rozwiązań nie działa na przykład w przypadku hostów wirtualnych.

Po wielu odsyłacz i czytania, chcę przyczynić się do mojego własnego rozwiązania, które "działa dla mnie". Mam nadzieję, że tobie też się uda. Nie stworzyłem go od zera, byłem zainspirowany przez wszystkie inne wkłady (chociaż większość z nich nie "działała dla mnie" bez modyfikacji).

RewriteEngine on

#if foo requested, return foo.html contents
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f
RewriteRule ^(.*)$ $1.html [L]

#redirect foo.html to foo
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.+)\.html$ $1 [R,L]

Znacznik [R] domyślnie wykonuje tymczasowe (302) przekierowanie; jeśli chcesz mieć stałe przekierowanie, użyj R=301 zamiast R.

 0
Author: Garret Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-26 23:11:55