Betalingsmetoder Abuse

Aktivér Apache Mod Rewrite

06.03.2022, 00:06

Når en bruger indtaster en bestemt URL i en browser og trykker på Enter, forsøger den webserver, der modtager anmodningen, at finde en fil på serveren på den sti, der er angivet i URL'en. Hvis der ikke findes noget langs stien, åbnes en indeksfil som index.html eller index.php. Hvis der ikke findes noget, returneres en 404-fejl. Vi ville ikke have smukke og letforståelige URL'er, hvis tingene ikke fungerede, som de gør nu. Disse URL'er bruges på mange sites. Apache mod rewrite-modulet er designet til at løse dette problem. I denne vejledning vil vi se, hvordan man aktiverer det.

Aktivering af modulet

Hvis alt fungerede som beskrevet, skulle der være en fil eller et script med samme navn i adresselinjen, når man åbner et link til dette websted i rodmappen. Men det gør der ikke. Når der anmodes om denne URL, forsøger webserveren at finde en sådan fil, men hvis den ikke finder den, giver den i stedet for at returnere en 404-fejl kontrollen videre til mod_rewrite-modulet, som for alle sådanne URL'er udfører index.php-scriptet og giver det forespørgselsstrengen efter domænet. PHP bruger så disse data til at finde og returnere den side, brugeren har brug for.

For at aktivere mod rewrite skal du køre en simpel kommando:

$ sudo a2enmod rewrite

Efter genstart af webserveren:

$ sudo systemctl restart apache

Bare fordi modulet er aktiveret på Apache-webserverniveau, betyder det ikke, at det vil fungere for en hjemmeside. Til dette formål skal det konfigureres i .htaccess-filen og specificere, hvilket script der skal sende anmodninger til ikke-eksisterende sider. For at .htaccess-filen kan fungere, skal AllowOwerride: All-direktivet tilføjes til Directory-sektionen på den virtuelle host

Som et eksempel:

Dernæst skal du f.eks. i WordPress tilføje linjer som denne til .htaccess-filen:

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

Al kode placeres i IfModule-direktivet, så koden i det kun kan udføres, når mod_rewrite-modulet er aktiveret, ellers ignoreres disse linjer simpelthen. RewriteEngine On-direktivet aktiverer modulet for den aktuelle mappe. Derefter specificerer RewriteBase, at hele strengen efter domænet skal sendes til scriptet. Dernæst kommer RwriteRule-regler med betingelser for dem RewriteCond, som udføres strengt sekventielt.

En af RewriteRule-reglerne ^index. php$ - [L] siger, at hvis URL'en indeholder index.php, skal URL'en omskrives til /. I dette regulære udtryk er hele strengen specificeret, og punktummet er escaped med en backslash. Flaget [L] betyder, at hvis URL'en matcher denne regel, skal de følgende regler ikke kontrolleres. Når denne regel er udført, vil URL'en blive omskrevet, og webserveren vil antage, at den har modtaget anmodningen /, regelanalysen vil starte igen, og denne gang vil den matche den sidste regel.

RewriteCond-betingelserne gælder for alle efterfølgende regler. Så vi har RewriteCond %{REQUEST_FILENAME} !-f og RewriteCond %{REQUEST_FILENAME} !-d, der kun tillader den sidste regel at blive udført, hvis URL'en ikke er en fil eller mappe. Den sidste regel omdirigerer alt til ./index.php-scriptet.

Hvis du ikke kan forstå mod_rewrite-indstillingerne, er det værd at se på, hvad der sker inde i webserveren under dine omdirigeringer. For at gøre dette skal du tilføje denne linje i konfigurationen af webstedets virtuelle vært.

Det kan du f.eks. gøre:

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

LogLevel warn rewrite:trace4

Så vil du i logfilen, som er angivet i ErrorLog-direktivet, se alle webserverens forsøg på at konvertere URL'en i henhold til dine regler og vil være i stand til at forstå, hvad du gør forkert. I denne vejledning har vi gennemgået, hvordan man aktiverer Apache mod rewrite, og hvordan det hele fungerer, og hvordan man leder efter fejl.