Metody płatności Abuse

Włącz Apache Mod Rewrite

06.03.2022, 00:06

Gdy użytkownik wprowadza określony adres URL w przeglądarce i naciska klawisz Enter, serwer WWW, który odbiera żądanie, próbuje znaleźć plik na serwerze w ścieżce określonej w adresie URL. Jeśli nic nie zostanie znalezione wzdłuż ścieżki, otwierany jest plik indeksu, taki jak index.html lub index.php. Jeśli nic nie zostanie znalezione, zwracany jest błąd 404. Nie mielibyśmy pięknych i łatwych do zrozumienia adresów URL, gdyby nie działały one tak, jak teraz. Te adresy URL są używane na wielu stronach. Moduł apache mod rewrite został zaprojektowany w celu rozwiązania tego problemu. W tym poradniku zobaczymy, jak go włączyć.

Włączanie modułu

Gdyby wszystko działało zgodnie z opisem, to po otwarciu dowolnego linku tej witryny w katalogu głównym powinien istnieć plik lub skrypt o tej samej nazwie z paska adresu. Ale tak nie jest. Podczas żądania tego adresu URL serwer internetowy próbuje znaleźć taki plik, ale jeśli go nie znajdzie, zamiast zwracać błąd 404, przekazuje kontrolę do modułu mod_rewrite, który dla wszystkich takich adresów URL wykonuje skrypt index.php, przekazując mu ciąg zapytania po domenie. Następnie PHP używa tych danych do znalezienia i zwrócenia strony, której potrzebuje użytkownik.

Aby włączyć mod rewrite należy wykonać proste polecenie:

$ sudo a2enmod rewrite

Po ponownym uruchomieniu serwera WWW:

$ sudo systemctl restart apache

Tylko dlatego, że moduł jest włączony na poziomie serwera Apache, nie oznacza, że będzie działał dla strony internetowej. W tym celu należy go skonfigurować w pliku .htaccess, określając na jaki skrypt przekazywać żądania do nieistniejących stron. Aby plik .htaccess działał, dyrektywa AllowOwerride: All musi zostać dodana do sekcji Directory wirtualnego hosta

Jako przykład:

Następnie, na przykład w WordPress należy dodać do pliku .htaccess linie takie jak ta:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Cały kod jest umieszczany w dyrektywie IfModule, dzięki czemu kod w niej zawarty jest wykonywany tylko wtedy, gdy moduł mod_rewrite jest włączony, w przeciwnym razie linie te są po prostu ignorowane. Dyrektywa RewriteEngine On włącza moduł dla bieżącego katalogu. Następnie RewriteBase określa, że cały ciąg znaków po domenie powinien zostać przekazany do skryptu. Następnie pojawiają się reguły RewriteRule z warunkami dla nich RewriteCond, które są wykonywane ściśle sekwencyjnie.

Jedna z reguł RewriteRule ^index .php$ - [L] mówi, że jeśli adres URL zawiera index.php, adres URL powinien zostać przepisany do /. W tym wyrażeniu regularnym określony jest cały ciąg znaków, a kropka jest ukrywana za pomocą odwrotnego ukośnika. Flaga [L] oznacza, że adres URL pasuje do tej reguły, a następnie następujące reguły nie powinny być sprawdzane. Po wykonaniu tej reguły adres URL zostanie przepisany, a serwer internetowy założy, że otrzymał żądanie /, analiza reguły rozpocznie się ponownie i tym razem będzie pasować do ostatniej reguły.

Warunki RewriteCond mają zastosowanie do wszystkich kolejnych reguł. Tak więc RewriteCond %{REQUEST_FILENAME} ! -f i RewriteCond %{REQUEST_FILENAME} !-d pozwalają na wykonanie ostatniej reguły tylko wtedy, gdy adres URL nie jest plikiem lub folderem. Ostatnia reguła przekierowuje wszystko do skryptu ./index.php.

Jeśli nie możesz zrozumieć ustawień mod_rewrite, warto sprawdzić, co dzieje się wewnątrz serwera WWW podczas przekierowań. Aby to zrobić w konfiguracji wirtualnego hosta witryny, należy dodać tę linię.

Na przykład:

$ sudo vi /etc/apache2/sites-available/001-texts.conf

LogLevel warn rewrite:trace4

Następnie w pliku dziennika, który jest podany w dyrektywie ErrorLog, zobaczysz wszystkie próby serwera WWW, aby przekonwertować adres URL zgodnie z twoimi regułami i będziesz w stanie zrozumieć, co robisz źle. W tym samouczku omówiliśmy, jak włączyć Apache mod rewrite, a także jak to wszystko działa i jak szukać błędów.