Website Rewrite Rules – Een pagina doorverwijzen


Tags: doorverwijzen

Webpagina’s doorverwijzen is een handige manier om ervoor te zorgen dat je bezoekers niet op een niet-bestaande pagina uitkomen. Er zijn verschillende manieren om doorverwijzingen in te stellen. In dit artikel ligt de focus op Rewrite Rules, maar we kaarten eerst twee simpelere en snellere manieren aan.

Magento pakketten met Hypernode technologie (Magento Start, Grow en Professional) draaien op Nginx. Hiervoor werken Rewrite Rules net even anders. Meer informatie hierover vind je in de Hypernode support documentatie.

Waarom doorverwijzen?

Tijdens het ontwikkelen van je website kan het voorkomen dat je de locatie van de webpagina moet wijzigen. Wanneer je pagina goed bezocht wordt en er al meerdere malen naar wordt verwezen is het niet wenselijk dat bezoekers op een dode link uitkomen. Ook is je pagina vaak al geïndexeerd door verschillende zoekmachines en zoekmachines houden over het algemeen niet van dode URLS´s. Je kunt dan het beste bezoekers omleiden naar de nieuwe pagina middels een redirect. Je kunt op verschillende manieren een redirect instellen.

Doorverwijzen middels je .Htaccess en HTML

Je kunt op verschillende manieren je website of een pagina doorverwijzen naar een andere website-pagina. Je kunt namelijk simpelweg in je .htaccess de regel redirect 301 invoeren en daarachter aangeven welke pagina moet worden doorverwezen. Bijvoorbeeld:

redirect 301 /verkeerd.html http://byte.nl/juist.html

Dit kun je dus voor elke pagina zo instellen. Kijk ook voor meer informatie op deze pagina.  Een andere handige, maar minder nette oplossing is je URL redirecten middels de browser. Je stelt dan een redirect in door middel van HTML. Je plaatst simpelweg de volgende code tussen de <HEAD> en </HEAD> tags in je code:

<meta HTTP-EQUIV="REFRESH"content="0; url=http://www.domeinnaam.nl/index.html">

Door middel van bovenstaande code worden je bezoekers gelijk doorgestuurd naar de webpagina die je hebt toegewezen. Achter content staat in de code nu een “0”. Het getal dat je hier invult is het aantal seconden dat de browser wacht met doorsturen. Als je hier “0” laat staan wordt de bezoeker gelijk doorverwezen.

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

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$ bar

Deze 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$ baz

Nu 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.

RewriteRule Vlaggen

Als derde argument aan RewriteRule kun je 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} !foo

Een 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 CondPattern

De 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 zul je de omgevingsvariabele in jouw PHP script niet terugvinden omdat Suexec de omgevingsvariabelen op schoont.

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 [L,R=301]

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 [L,R=301]

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 [L,R=301]

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.

3