Betalningsmetoder Abuse

Aktivera Apache Mod Rewrite

06.03.2022, 00:06

När en användare skriver in en specifik URL i en webbläsare och trycker på Enter, försöker webbservern som tar emot begäran att hitta en fil på servern på den sökväg som anges i URL:en. Om inget hittas längs sökvägen öppnas en indexfil som index.html eller index.php. Om inget hittas returneras ett 404-fel. Vi skulle inte ha vackra och lättförståeliga webbadresser om inte saker och ting fungerade på det sätt som de gör nu. Dessa webbadresser används på många webbplatser. Apache mod rewrite-modulen är utformad för att lösa detta problem I den här handledningen kommer vi att se hur du aktiverar den.

Aktivering av modulen

Om allt fungerade som beskrivet, då när du öppnar någon länk på den här webbplatsen i rotkatalogen bör det finnas en fil eller ett skript med samma namn från adressfältet. Men det gör det inte. När du begär den här webbadressen försöker webbservern hitta en sådan fil, men om den inte hittar den, istället för att returnera ett 404-fel, skickar den kontrollen till mod_rewrite-modulen, som för alla sådana webbadresser kör index.php-skriptet och skickar den frågesträngen efter domänen. PHP använder sedan dessa data för att hitta och returnera den sida som användaren behöver.

För att aktivera mod rewrite kör ett enkelt kommando:

$ sudo a2enmod rewrite

Efter omstart av webbservern:

$ sudo systemctl restart apache

Bara för att modulen är aktiverad på Apache-webbservernivå betyder det inte att den kommer att fungera för en webbplats. För detta ändamål måste den konfigureras i .htaccess-filen, ange vilket skript som ska skicka förfrågningar till icke-existerande sidor. För att .htaccess-filen ska fungera måste direktivet AllowOwerride: All läggas till i Directory-avsnittet på den virtuella värden

Som ett exempel:

I WordPress måste du till exempel lägga till rader som denna 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 kod placeras i IfModule-direktivet, vilket gör att koden i det endast kan köras när mod_rewrite-modulen är aktiverad, annars ignoreras dessa rader helt enkelt. Direktivet RewriteEngine On aktiverar modulen för den aktuella katalogen. Sedan anger RewriteBase att hela strängen efter domänen ska skickas till skriptet. Därefter kommer RwriteRule-regler med villkor för dem RewriteCond, som körs strikt sekventiellt.

En av RewriteRule-reglerna ^index .php$ - [L] säger att om URL:en innehåller index.php ska URL:en skrivas om till /. I det här reguljära uttrycket anges hela strängen och punkten undviks med ett backslash. Flaggan [L] innebär att om URL:en matchar den här regeln ska följande regler inte kontrolleras. När den här regeln har körts skrivs URL:en om och webbservern antar att den har tagit emot begäran /, regelanalysen börjar om och den här gången matchar den den sista regeln.

RewriteCond-villkoren gäller för alla efterföljande regler. Så vi har RewriteCond %{REQUEST_FILENAME} !-f och RewriteCond %{REQUEST_FILENAME} !-d som gör att den sista regeln bara kan utföras om URL:en inte är en fil eller mapp. Den sista regeln omdirigerar allt till skriptet ./index.php.

Om du inte kan förstå mod_rewrite-inställningarna är det värt att titta på vad som händer inuti webbservern under dina omdirigeringar. För att göra detta i konfigurationen av webbplatsens virtuella värd måste du lägga till den här raden.

Till exempel:

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

LogLevel warn rewrite:trace4

Sedan i loggfilen, som ges i ErrorLog-direktivet, kommer du att se alla försök från webbservern att konvertera webbadressen enligt dina regler och kommer att kunna förstå vad du gör fel. I den här handledningen har vi täckt hur man aktiverar Apache mod-omskrivning, liksom hur det hela fungerar och hur man letar efter fel.