Apache mod rewrite in combinatie met bestanden en mappen17-01-2010 22:00
In dit artikel leg ik uit hoe je optimaal gebruik kan maken van Apache Mod rewrite in combinatie met bestanden en mappen om je website te voorzien van friendly url’s. Friendly url’s zijn leesbare url’s. Dit heeft zowel voordelen voor je bezoekers, zoekmachines en daarnaast ziet het er gewoon mooi uit.
Voorbeelden van friendly url’s:
http://www.mijndomein.nl/producten/1-productnaam
http://www.mijndomein.nl/contact
Ik ga ervan uit dat je al ervaren genoeg bent om te werken met PHP/HTML en het ophalen van variabelen uit de URL. Ik ga dus niet in op het PHP/HTML gedeelte.
http://www.mijndomein.nl/producten.php?product_id=1&categorie_id=2
Ook het filteren van de variabelen zal je moeten doen in PHP en is ook een echte aanrader. Een gedeelte zal al wel gedaan worden door Mod rewrite zoals je later zult lezen. Vrijwel alle hosting bedrijven ondersteunen deze functionaliteit. Twijfel je, vraag het dan na.
Stap 1: Het bestand .htaccess
Het makkelijkste kan je een .htaccess bestand maken in kladblok. Let op dat je het opslaat met de punt vooraan. Een truc omdat in Kladblok te doen is door aanhalingstekens om de bestandsnaam te plaatsen. Het wordt dan “.htaccess”.
.htaccess Is een leuk bestand wat gebruikt wordt door Apache en biedt veel mogelijkheden, veel meer dan Mod rewrite ondersteuning. Daarom raad ik je aan wijzigingen niet op een live website te testen, maar op een test website. Zo kan je eerst zien wat er gebeurt na een wijziging. Een verkeerde wijziging kan namelijk betekenen dat je website (even) niet meer werkt.
Stap 2: De module Mod rewrite aanzetten
Nu gaan we de module aanzetten met de onderstaande regel. Deze moet boven alle regels staan die dadelijk toegevoegd worden.
RewriteEngine On
Door gebruik te maken van het # teken kan je commentaarregels toevoegen aan het bestand. Deze worden genegeerd tijdens het uitvoeren.
Stap 3: Een RewriteRule toevoegen
Een RewriteRule beschrijft wat er moet gebeuren doormiddel van een vergelijking zoals de onderstaande. Het gedeelte in de URL (alles na de slash in de domeinnaam) wordt als vergelijking gebruikt.
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?p=$1 [L]
Toelichting:
| ^ |
begin van de string die vergeleken moet worden |
| ([A-Z-a-z0-9-]+)/? |
zorgt ervoor dat alleen de genoemde tekens geaccepteerd worden |
| $ |
einde van de string die vergeleken moet worden |
| index.php?p= |
het bestand waarnaar verwezen wordt |
| $1 |
de variabelen die tussen ([ ]) in de vergelijking staa |
| [L] |
dit forceert dat als er een overeenkomst is dat er niet verder wordt gekeken, er kunnen immers meerdere overeenkomsten zijn |
Stap 4: De RewriteRule uitbreiden
De bovenstaande RewriteRule maakte maar gebruik van 1 variabele, maar heel vaak heb je er meerdere nodig. Zie daarvoor het onderstaande voorbeeld wat nu voor zichzelf moet spreken:
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php5?p=$1&id=$2&subid=$3
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?p=$1&id=$2
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?p=$1 [L]
Toelichting:
Zoals je ziet wordt eerst de langste vergelijking getoond gevolgd door een steeds kortere. Er wordt namelijk van links naar rechts gelezen en vergeleken. Voorbeeld:
http://www.mijndomein.nl/producten/fietsen/naam-343DD
Als deze vergelijking eerst bij de kortste RewriteRule komt wordt alleen het gedeelte producten toegevoegd aan de eerste variabelen en de rest gaat verloren.
Natuurlijk kunnen de bovenstaande RewriteRules verder uitgebreid worden om meerdere variabelen te ondersteunen.
Oud bestand naar nieuw bestand verwijzen
De onderstaande RewriteRule geeft aan hoe je een oud bestand naar een nieuw bestand kan laten verwijzen. Handig als een oude site met HTML of PHP bestanden werkt en de nieuwe met friendly url’s.
RewriteRule producten\.html$ producten
Toelichting:
\. = geeft aan dat de . letterlijk meegenomen moet worden
Verwijzing naar mappen of submappen vanuit de root
Het kan wel eens voorkomen dat je niet direct naar een bestand wilt verwijzen maar naar een bestand in een andere map. Dit kan het geval zijn als je op een locatie een hoofdsite met daarnaast nog een paar subsites heb draaien. Die subsites zitten dan in een map van de hoofdsite.
Belangrijk is het om te weten dat je in die mappen niet opnieuw een .htaccess bestand plaatst waar je met RewriteRules werkt. Dat gaat namelijk niet goed en zorgt alleen maar voor foutmeldingen.
De RewriteRules die je wilt gebruiken in een subsite moet je dus toevoegen aan het .htaccess bestand in de hoofdsite. Ze zijn vrijwel hetzelfde als de eerder genoemde RewriteRules alleen is er een kleine aanpassing doorgevoerd:
RewriteRule ^subsite/$ subsite_map/index.php
RewriteRule ^subsite$ subsite_map /index.php [L]
In plaats van dat er verwezen wordt naar een bestand in de map waar het .htaccess bestand staat, wordt er nu verwezen naar een bestand in een andere map. Natuurlijk kan je het pad ook nog uitbreiden met meer mappen.
De reden dat ik subsite na het ^ teken plaats is dat ik zo forceer dat url’s waarin de tekst subsite voorkomt doorverwezen worden naar het bestand in de map. Als dat er niet staat weet Mod rewrite nooit wanneer de url wel of niet naar het bestand in de map moet.
Er is nog veel meer mogelijk met .htaccess, maar dit artikel heb ik geschreven om uit te leggen hoe je .htaccess bestanden kan gebruiken in verschillende bestanden en mappen
.:Terug:.