Når en bruker skriver inn en bestemt URL i en nettleser og trykker på Enter, prøver webserveren som mottar forespørselen, å finne en fil på serveren i den banen som er angitt i URL-en. Hvis det ikke finnes noe langs stien, åpnes en indeksfil som index.html eller index.php. Hvis det ikke finnes noe, returneres en 404-feilmelding. Vi ville ikke hatt vakre og lettfattelige nettadresser hvis ikke ting fungerte slik de gjør nå. Disse URL-ene brukes på mange nettsteder. Modulen apache mod rewrite er utviklet for å løse dette problemet. I denne veiledningen skal vi se hvordan du aktiverer den.
Hvis alt fungerte som beskrevet, burde det eksistere en fil eller et skript med samme navn fra adresselinjen når du åpner en hvilken som helst lenke til dette nettstedet i rotkatalogen. Men det gjør det ikke. Når du ber om denne URL-en, prøver webserveren å finne en slik fil, men hvis den ikke finner den, i stedet for å returnere en 404-feil, overfører den kontrollen til mod_rewrite-modulen, som for alle slike nettadresser kjører index.php-skriptet, og sender det spørringsstrengen etter domenet. PHP bruker deretter disse dataene til å finne og returnere siden brukeren trenger.
For å aktivere mod rewrite kjører du en enkel kommando:
$ sudo a2enmod rewrite
Etter at du har startet webserveren på nytt:
$ sudo systemctl restart apache
Selv om modulen er aktivert på Apache-webservernivå, betyr ikke det at den vil fungere for et nettsted. For dette formålet må den konfigureres i .htaccess-filen, angi hvilket skript som skal sende forespørsler til ikke-eksisterende sider. For at .htaccess-filen skal fungere, må AllowOwerride: All-direktivet
legges til i Directory-delen av den virtuelle verten
Som et eksempel:
I WordPress må du for eksempel legge til linjer som dette i .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>
All kode er plassert i IfModule-direktivet, slik at koden i det bare kan utføres når mod_rewrite-modulen er aktivert, ellers blir disse linjene ganske enkelt ignorert. RewriteEngine On-direktivet aktiverer modulen for den aktuelle katalogen. Deretter angir RewriteBase at hele strengen etter domenet skal sendes til skriptet. Deretter kommer RwriteRule-regler med betingelser for dem RewriteCond, som kjøres strengt sekvensielt.
En av RewriteRule-reglene ^index .php$ - [L]
sier at hvis URL-en inneholder index.php, skal URL-en skrives om til /. I dette regulære uttrykket er hele strengen spesifisert, og punktumet er escaped med en backslash. Flagget [L]
betyr at hvis URL-en samsvarer med denne regelen, skal de følgende reglene ikke sjekkes. Etter at denne regelen er utført, blir URL-adressen omskrevet, og webserveren antar at den har mottatt forespørselen /, regelanalysen starter på nytt, og denne gangen vil den matche den siste regelen.
RewriteCond-betingelsene gjelder for alle påfølgende regler. Så vi har RewriteCond %{REQUEST_FILENAME} !-f
og RewriteCond %{REQUEST_FILENAME} !-d
, slik at den siste regelen bare kjøres hvis URL-en ikke er en fil eller mappe. Den siste regelen omdirigerer alt til ./index.php-skriptet.
Hvis du ikke forstår mod_rewrite-innstillingene, er det verdt å se på hva som skjer inne på webserveren under viderekoblingene. For å gjøre dette i konfigurasjonen av den virtuelle verten for nettstedet, må du legge til denne linjen.
For eksempel:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
Så i loggfilen, som er gitt i ErrorLog-direktivet, vil du se alle forsøkene fra webserveren på å konvertere URL-en i henhold til reglene dine og vil kunne forstå hva du gjør galt. I denne veiledningen har vi gått gjennom hvordan du aktiverer Apache mod rewrite, hvordan det hele fungerer og hvordan du kan se etter feil.