Jak zaimplementować przepisywanie adresów URL w moim pliku .htaccess?

17

Chciałbym przepisać adresy URL (dlaczego? Zobacz to pytanie ), aby zamiast użytkowników zobaczyć adresy takie jak

labouseur.com/course-compilers.html 

zamiast tego mogą po prostu zobaczyć i używać

labouseur.com/course-compilers

(Jeszcze lepiej, może powinienem to zrestrukturyzować, aby były to kursy / kompilatory)

Korzystam z opartej na Linuksie wspólnej usługi hostingu dla mojej witryny, więc nie mam kontroli administracyjnej nad serwerem, ale mam kontrolę nad .htaccess. Referencje, które przeczytałem w Internecie, wydawały mi się mniej niż jasne, dlatego szukam tu trochę jasności i porady.

Alan
źródło
Zauważ, że nie jest to coś, co robisz tylko w konfiguracji serwera (.htaccess). Ważnym pierwszym krokiem jest zmiana adresów URL w aplikacji, w przeciwnym razie pojawi się wiele niepotrzebnych przekierowań (lub duplikatów treści).
MrWhite

Odpowiedzi:

13

Możesz faktycznie usunąć plik .html z plików na serwerze i ustawić ustawienia w htaccess, aby były one podawane jako pliki html, ale prawdopodobnie nie tego szukasz.

Zrób to :

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ $1.html
Rizwan Kassim
źródło
Tutaj jest bardziej złożona, szczególnie jeśli martwisz się problemami z powielonymi treściami. Zgodnie z powyższą regułą strony będą nadal dostępne ze starych adresów URL.
JasonBirch
3

Najpierw upewnij się, że apache ma moduł i że jest dozwolony w plikach .htacces, a następnie dodaj:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/$1 

Twój przykład wymagałby

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /$1.html

Dla struktury katalogów jednopoziomowych i

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /$1.html

Dla struktury wielopoziomowej.

Ale bądź ostrożny

Jeśli masz strukturę

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess

Reguły przepisywania w dziecku .htaccessplików będzie w stosunku do swojego folderu nadrzędnego i można dostać w niektórych kłopotliwych sytuacjach pętlowych przepisać. Upewnij się, że używasz, RewriteCondaby zatrzymać je, jeśli możesz!

Aiden Bell
źródło
Czy masz coś więcej na punkcie ostatniego punktu (użycie RewriteCond do zatrzymania pętli)?
Travis Northcutt,
2

Oprócz powyższych odpowiedzi można użyć

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ $1.html [L]

([\w-]+) Pozwala na litery, cyfry z łącznikiem (-).

(.*) przepisze każde żądanie niezależnie, co może impotentować inne poniższe reguły powodujące wewnętrzny błąd serwera podczas uzyskiwania dostępu.

Abhishek Gurjar
źródło
Twój RewriteRule wzorzec stanowi ulepszenie w stosunku do przyjętej odpowiedzi dla konkretnego przykładu podanego w pytaniu, jednak nie będzie pasował do bardziej ogólnego przypadku, gdy występuje więcej niż jeden segment ścieżki, np. /path/to/course-compilers. Dołącz Lflagę, aby zmniejszyć wpływ na następujące reguły. Chociaż (.*)wzorzec jest niepotrzebnie ogólny, jest mało prawdopodobne, aby powodował poważne problemy z powodu warunku, że plik istnieje.
MrWhite
1

Aby tego dokonać, nie musisz używać pliku .htaccess. Po prostu uporządkuj swoje pliki w katalogach i zamiast używać „labouseur.com/course-compilers.html”, po prostu nazwij plik index.html i umieść go w katalogu o nazwie „kompilatory kursów”. Następnie, gdy wskażesz ten katalog, indeks jest domyślnie obsługiwany, ale nie będzie wyświetlany w adresie URL. Możesz więc napisać swoje linki jako „labourseur.com/course-compilers” i wszystko będzie dobrze.

Nie wymaga .htaccess.

Joel Glovier
źródło