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.


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

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!


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.


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.

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.