Aby zrozumieć, czym jest mod_rewrite, musisz najpierw zrozumieć, jak działa serwer WWW. Serwer WWW odpowiada na żądania HTTP . Żądanie HTTP na najbardziej podstawowym poziomie wygląda następująco:
GET /foo/bar.html HTTP/1.1
Jest to proste żądanie przeglądarki skierowane do serwera WWW, które żąda od niego adresu URL /foo/bar.html
. Ważne jest, aby podkreślić, że nie żąda pliku , żąda tylko jakiegoś dowolnego adresu URL. Żądanie może również wyglądać tak:
GET /foo/bar?baz=42 HTTP/1.1
Jest to równie ważne żądanie adresu URL, a bardziej oczywiste nie ma nic wspólnego z plikami.
Serwer WWW to aplikacja nasłuchująca na porcie, przyjmująca żądania HTTP przychodzące na tym porcie i zwracająca odpowiedź. Serwer WWW może odpowiadać na każde żądanie w dowolny sposób, jaki uzna za stosowny / w dowolny sposób, w jaki go skonfigurowałeś. Ta odpowiedź nie jest plikiem, jest odpowiedzią HTTP, która może, ale nie musi mieć nic wspólnego z fizycznymi plikami na dowolnym dysku. Serwer WWW nie musi być serwerem Apache, jest wiele innych serwerów WWW, które są po prostu programami działającymi trwale i podłączonymi do portu odpowiadającego na żądania HTTP. Możesz sam napisać. Ten akapit miał na celu oderwanie Cię od poglądu, że adresy URL są bezpośrednio równe plikom, co jest naprawdę ważne do zrozumienia. :)
Domyślna konfiguracja większości serwerów WWW polega na wyszukiwaniu pliku zgodnego z adresem URL na dysku twardym. Jeśli katalog główny serwera jest ustawiony na, powiedzmy, /var/www
może sprawdzić, czy plik /var/www/foo/bar.html
istnieje i jeśli tak jest, może go obsłużyć. Jeśli plik kończy się na „.php”, wywoła interpreter PHP, a następnie zwróci wynik. Całe to powiązanie jest w pełni konfigurowalne; plik nie musi kończyć się rozszerzeniem „.php”, aby serwer WWW mógł go uruchomić przez interpreter PHP, a adres URL nie musi pasować do żadnego konkretnego pliku na dysku, aby coś się wydarzyło.
mod_rewrite to sposób na przepisanie wewnętrznej obsługi żądań. Gdy serwer WWW otrzyma żądanie adresu URL /foo/bar
, możesz przepisać ten adres URL na coś innego, zanim serwer WWW będzie szukał pliku na dysku, aby go dopasować. Prosty przykład:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Ta reguła mówi, że za każdym razem , gdy żądanie pasuje do „/ foo / bar”, przepisz je do „/ foo / baz”. Żądanie będzie wówczas obsługiwane tak, jakby /foo/baz
zamiast tego zostało poproszone. Można to wykorzystać do różnych efektów, na przykład:
RewriteRule (.*) $1.html
Ta reguła dopasowuje cokolwiek ( .*
) i przechwytuje to ( (..)
), a następnie przepisuje, aby dodać „.html”. Innymi słowy, jeśli /foo/bar
żądany adres URL byłby obsługiwany tak, jakby /foo/bar.html
został poproszony. Widzieć http://regular-expressions.info, aby uzyskać więcej informacji na temat dopasowywania, przechwytywania i zastępowania wyrażeń regularnych.
Inną często spotykaną zasadą jest:
RewriteRule (.*) index.php?url=$1
To znowu dopasowuje wszystko i przepisuje go do pliku index.php z pierwotnie żądanym adresem URL dołączonym do url
parametru zapytania. Oznacza to, że dla wszystkich przychodzących żądań wykonywany jest plik index.php i ten plik będzie miał dostęp do pierwotnego żądania w$_GET['url']
, dzięki czemu może zrobić z nim wszystko, co zechce.
Przede wszystkim umieszczasz te reguły przepisywania w pliku konfiguracyjnym serwera WWW . Apache pozwala także * umieścić je w pliku o nazwie .htaccess
w katalogu głównym twojego dokumentu (tj. Obok plików .php).
* Jeśli pozwala na to podstawowy plik konfiguracyjny Apache; jest opcjonalny, ale często jest włączony.
Co mod_rewrite czy nie zrobić
mod_rewrite nie sprawia, że wszystkie adresy URL są „ładne”. To powszechne nieporozumienie. Jeśli masz to łącze w swojej witrynie internetowej:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
mod_rewrite nie może nic zrobić, aby było to ładne. Aby był to ładny link, musisz:
Zmień link na ładny link:
<a href="https://stackoverflow.com/my/pretty/link">
Użyj mod_rewrite na serwerze, aby obsłużyć żądanie do adresu URL /my/pretty/link
za pomocą jednej z metod opisanych powyżej.
(Można go użyć mod_substitute
w połączeniu do przekształcenia wychodzących stron HTML i zawartych w nich linków. Chociaż jest to zwykle więcej wysiłku niż tylko aktualizacja zasobów HTML.)
Jest wiele możliwości mod_rewrite i bardzo złożone reguły dopasowywania, które możesz utworzyć, w tym łączenie kilku poprawek, przesyłanie żądań do zupełnie innej usługi lub maszyny, zwracanie określonych kodów stanu HTTP jako odpowiedzi, przekierowywanie żądań itp. Jest bardzo potężny i może być używany do świetnie, jeśli rozumiesz podstawowy mechanizm odpowiedzi na żądanie HTTP. Tak nie jest automatycznie dokonać linki ładna.
Zobacz oficjalną dokumentację dla wszystkich możliwych flag i opcji.