We proberen de kwaliteit van onze kennisbank voortdurend te verbeteren.
Geef de informatie op deze pagina een waardering met de slider hierboven.
Website Rewrite Rules
RewriteRules zijn regels waarmee je een url van je website kunt omschrijven naar een andere url van de website, of redirecten naar een andere url van de website of een andere website. Dit kan handig zijn als je bijvoorbeeld meerdere domeinen aan je hostingpakket wilt koppelen, of SEF urls wilt gebruiken.
Omdat RewriteRules een gevorderd onderwerp zijn, eerst een paar voorbehouden:
- we geven geen inhoudelijke ondersteuning op het schrijven van RewriteRules
- gebruik geen RewriteRules als een eenvoudiger oplossing net zo goed voldoet. Een redirect kan vaak ook met een redirectmatch of met een PHP script
Inhoud |
Een url omschrijven naar een andere url
Hiervoor maken we een .htaccess aan met de regel
RewriteEngine On
RewriteRules
Op regel twee zetten we
RewriteRule ^foo$ barDeze regel zorgt dat www.domein.nl/foo opgevraagd wordt, de inhoud van www.domein.nl/bar getoond zal worden.
- Nadere uitleg
- De URL is dus http://www.domein.nl/foo. Het url-pad is foo. Zie ook de Apache documentatie
- ^foo$ is een reguliere expressie. Een uitleg van reguliere expressies valt buiten het bestek van dit artikel maar in het kort geeft ^ aan dat foo het begin is van het url-pad, en de $ geeft aan dat dit tevens het einde is van het url-pad. Zonder de ^ zou deze regel ook barfoo of bar/foo matchen, en zonder de $ zou hij ook foobar of foo/bar matchen.
Voeg nu een derde regel toe:
RewriteRule ^bar$ bazNu zal /foo omgeschreven worden naar bar en daarna naar baz. Het eindresultaat is dat bij een verzoek om http://www.domein.nl/foo de inhoud van baz teruggegeven zal worden. Als je om de een of andere reden een verzoek om foo wilt omschrijven naar bar en een verzoek om bar naar baz, is dit niet wat je wilt.
Vlaggen
Als derde argument aan RewriteRule kunt u vlaggen meegeven. De L vlag betekent dat de huidige RewriteRule als laatste verwerkt moet worden, dus de volgende RewriteRules worden voor dit verzoek genegeerd als de huidige RewriteRule matcht. Als we de eerste regel veranderen in
RewriteRule ^foo$ bar [L]zou je dus verwachten dat /foo weer omgeschreven wordt naar bar en bar naar baz. Dat gebeurt echter niet. In een .htaccess bestand werkt mod_rewrite in een per-directory context. hierdoor genereert Apache een interne redirect naar /bar. Het interne verzoek wordt opnieuw door de .htaccess omgeschreven, en deze keer match de ^foo$ regel niet dus wordt de tweede regel alsnog toegepast waardoor de bezoeker alsnog de inhoud van baz voorgeschoteld krijgt.
RewriteConds
We kunnen dit probleem verhelpen met een RewriteCond regel. Voor de derde regel moeten we hiervoor de volgende regel opnemen:
RewriteCond %{THE_REQUEST} !fooEen RewriteCond is een voorwaarde waaraan een verzoek moet voldoen. Als de RewriteConds waar zijn, wordt de RewriteRule uitgevoerd. De RewriteCond heeft de syntax
RewriteCond TestString CondPatternDe TestString bevat in de geval de variabele THE_REQUEST. Hierin staat het oorspronkelijke request. Het patroon is "foo", het uitroepteken betekent dat de conditie omgekeerd wordt en dus waar is als de Teststring niet matcht met het patroon. Dus als het oorspronkelijke verzoek niet "foo" is, wordt de tweede RewriteRule niet uitgevoerd.
Een andere manier om dit te doen is met een omgevingsvariabele:
RewriteEngine On RewriteRule ^foo$ bar [L,E=FOO:foo] RewriteCond %{ENV:REDIRECT_FOO} !foo RewriteRule ^bar$ baz
De eerste RewriteRule heeft nu weer een L vlag. In de eerste RewriteRule wordt verder aan een omgevingsvariabele FOO de waarde foo toegekend. De tweede RewriteRule wordt voorafgegaan door een RewriteCond die controleert of de omgevingsvariabele REDIRECT_FOO de waarde foo heeft. Door de internal redirect wordt de variabele FOO namelijk omgedoopt tot REDIRECT_FOO.
Overigens zult u de omgevingsvariabele in uw PHP script niet terugvinden omdat Suexec de omgevingsvariabelen opschoont zodat bijvoorbeeld !SetEnv in uw .htaccess ingestelde omgevingsvariabelen in uw PHP script niet beschikbaar zijn. Zie ook Php Omgevings Variabelen.
RewriteConds combineren
RewriteConds zijn te combineren door ze met [OR] of [AND] onder elkaar te schrijven.
- voorbeeld
- Op Website SSL Instellingen staat de volgende RewriteRule om bezoekers naar https door te sturen
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
Als je bezoekers aan http://domeinnaam.nl wilt doorsturen, kan dat met deze RewriteRule:
RewriteEngine On RewriteCond %{HTTP_HOST} !www\.domeinnaam\.nl [NC] RewriteRule ^(.*)$ http://www.domeinnaam.nl/$1 [R,L]
Als je dit wilt combineren (dus zowel https://domeinaam.nl als http://www.domeinnaam.nl als http://domeinnaam.nl naar https://www.domeinnaam.nl doorsturen) kan dat bijvoorbeeld zo:
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ [OR] RewriteCond %{HTTP_HOST} !www\.domeinnaam\.nl [NC] RewriteRule ^(.*)$ https://www.domeinnaam.nl/$1 [R,L]
Redirecten naar een andere url
In plaats van intern te redirecten, kunnen we ook een externe redirect maken. Hiervoor geven we de RewriteRule de R vlag mee. Als we de tweede regel veranderen in
RewriteRule ^foo$ bar [R]genereert de server een location redirect.
RewriteBase
Als je het bovenstaande probeert, zul je een melding krijgen als
- The requested URL /home/users/domeiftp/domein.nl/bar was not found on this server.
Dit heeft te maken met de base URL instelling. Default is de base URL het fysieke pad naar de directory, in dit geval /home/users/domeiftp/domein.nl. De base url wordt voor het gegenereerde url-pad toegevoegd. We kunnen de base url veranderen met de RewriteBase regel. Dus zetten we vóór regel 2
RewriteBase /dan gaat het goed. Een verzoek om http://domein.nl/foo wordt geredirect naar http://domein.nl/bar.
Met een location redirect kun je ook naar een andere website doorverwijzen. Maken we van regel 2
RewriteRule ^foo$ http://www.anderdomein.nl/bar [R]Dan wordt de bezoeker aan www.domein.nl/foo geredirect naar www.anderdomein.nl/bar. Als we alle bezoeken aan domein.nl willen redirecten naar anderdomein.nl, kan dat bijvoorbeeld met
RewriteRule ^(.*)$ http://www.anderdomein.nl/$1 [R]
Het gedeelte van het url-pad tussen haakjes kan dus met de $1 gesubstitueerd worden in de doel-url. Een bezoeker aan www.domein.nl/foo zal dan geredirect worden naar www.anderdomein.nl/foo, een bezoeker aan www.domein.nl/bar komt uit op www.anderdomein.nl/bar, enzovoort. Dit is overigens eenvoudiger te bereiken met een Redirect Match.
De huidige waardering is: 66/100 (7 stemmen)- Deze pagina is het laatst bewerkt op 9 feb 2012 om 16:33.
- Deze pagina is 2.257 keer bekeken.