.htaccess in WordPress: de 10 belangrijkste snippets (met generator)
Technische WordPress-handleidingen gaan er op een gegeven moment van uit dat je weet wat er in je .htaccess hoort, maar de precieze regels laten ze zelden zien. Dit artikel is het spiekbriefje dat daarbij ontbreekt: wat het bestand doet, waar je met je vingers vanaf blijft en welke tien snippets je in de praktijk nodig hebt.
Vroeg of laat is het zover: een tutorial zegt “zet dit even in je .htaccess” en laat je vervolgens met de helft van de informatie zitten. Dit artikel bundelt tien snippets voor htaccess in WordPress, stuk voor stuk uitgelegd, met de exacte code en zonder aan te nemen dat je al weet over welk bestand we het hebben. Wil je liever helemaal niets typen, dan klik je het bestand bij elkaar met de gratis htaccess-generator.
Wat is het .htaccess-bestand?
Het .htaccess-bestand is een configuratiebestand in platte tekst dat in de hoofdmap van je WordPress-installatie staat, op hetzelfde niveau als wp-config.php. De webserver leest het bij elke aanvraag opnieuw. Daarmee stuur je redirects, cache en HTTP-headers aan zonder de serverconfiguratie aan te raken en zonder dat er iets herstart hoeft te worden.
En dan de nuance die er zelden bij staat: .htaccess werkt alleen op Apache en, voor de gangbare directives, op LiteSpeed, dat het bestand compatibel uitleest. Draait je hosting op Nginx, dan negeert de server het bestand volledig, ook als je het netjes in de hoofdmap zet. Dezelfde regels horen daar in de centrale serverconfiguratie, met een andere syntaxis. Zoek dus eerst uit op welke webserver je hosting draait: meestal staat dat in je hostingpaneel, en anders weet de support van je hoster het.
Het blok van WordPress zelf: daar blijf je vanaf
Open je de .htaccess van een willekeurige WordPress-site met nette permalinks, dan zie je bovenaan een blok als dit:
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Dit blok zorgt ervoor dat je nette URL's, dus /blog/mijn-artikel/ in plaats van /?p=123, allemaal bij index.php aankomen. Die beslist vervolgens wat er getoond wordt. WordPress schrijft het blok automatisch opnieuw zodra je de permalink-instellingen opslaat. Pas je het met de hand aan, dan is je wijziging de eerstvolgende keer dat je opslaat zonder waarschuwing verdwenen. De regel is dus simpel: alles wat jij toevoegt komt buiten dit blok te staan, in de praktijk erboven, vóór # BEGIN WordPress.
Klik het bij elkaar: gratis .htaccess-generator
Wil je de regels liever niet met de hand typen? Onze generator bouwt een net becommentarieerd bestand uit precies deze modules: je vinkt aan wat je nodig hebt en kopieert of downloadt het resultaat. Alles gebeurt in je browser, er wordt niets geüpload.
De 10 belangrijkste .htaccess-snippets voor WordPress
Alle onderstaande snippets zet je buiten het blok # BEGIN WordPress / # END WordPress, meestal erboven. Je kunt ze los kopiëren, of ze in één keer laten samenstellen met de .htaccess-generator voor WordPress, die de blokken meteen tot één bestand samenvoegt en waarschuwt bij redirects die een oneindige lus opleveren.
1. HTTPS afdwingen
Stuurt elk bezoek via http permanent (301) door naar de https-versie, ook als een oude interne link nog naar http wijst. Voorwaarde is een werkend SSL-certificaat.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
2. www of zonder www vastleggen
Kies één versie van je domein, met of zonder www., en stuur de andere daarheen door. Dit snippet stuurt www door naar de variant zonder www; wil je het omgekeerd, dan draai je de voorwaarde om. Zonder zo'n regel kan Google beide varianten als aparte sites indexeren en verdeel je je linkwaarde over twee adressen.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [L,R=301]
</IfModule>
3. 301-redirects
Voor als je de URL van een pagina wijzigt of twee artikelen samenvoegt. Beheer je er meer dan een handjevol, dan is een plugin overzichtelijker dan handwerk in dit bestand, zoals we uitleggen in ons stuk over redirects beheren in WordPress. Voor een paar losse regels volstaat dit:
<IfModule mod_alias.c>
# Oude paden naar hun nieuwe URL sturen
Redirect 301 /oude-pagina https://jouwdomein.nl/nieuwe-pagina
</IfModule>
4. Browsercache
Vertelt de browser hoe lang hij afbeeldingen, CSS en JS mag hergebruiken zonder ze opnieuw op te halen. Dat scheelt vooral bij terugkerende bezoekers, want die halen bij een tweede bezoek alleen nog de HTML op.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>
5. GZIP-compressie
Comprimeert tekstbestanden zoals HTML, CSS, JS en JSON voordat ze de deur uit gaan. Ze komen sneller aan bij de browser en er verandert visueel helemaal niets.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
6. Securityheaders
Een handvol HTTP-headers die het aanvalsoppervlak van je WordPress-site verkleinen zonder dat je er een plugin voor installeert. Ze voorkomen dat de browser zelf gaat raden om wat voor bestandstype het gaat, blokkeren dat je site in een vreemd iframe wordt geladen en beperken welke apparaatfuncties een script mag opvragen.
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>
7. Eigen 404-pagina
WordPress serveert al een eigen 404-template uit je thema, en door het WordPress-blok hierboven komen ontbrekende adressen daar ook daadwerkelijk terecht. Deze regel is voor de gevallen waarin die herschrijfregels de aanvraag niet overnemen, bijvoorbeeld als mod_rewrite uitstaat of als een submap een eigen .htaccess heeft. Dan bepaalt deze regel wat de bezoeker te zien krijgt.
ErrorDocument 404 /404.html
Voorwaarde is wel dat er echt een 404.html in de hoofdmap staat. Ontbreekt dat bestand, dan valt de server terug op zijn eigen kale foutpagina.
8. Hotlinkbescherming
Voorkomt dat andere sites jouw afbeeldingen rechtstreeks vanaf jouw server laden en zo jouw dataverkeer verbruiken. De regel laat aanvragen door die van je eigen domein komen of helemaal geen referrer meesturen, bijvoorbeeld uit een bladwijzer, en blokkeert de rest. Vervang jouwdomein.nl door je echte domein.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?jouwdomein\.nl [NC]
RewriteRule \.(jpe?g|png|gif|webp|svg)$ - [F,NC,L]
</IfModule>
9. Directory listing uitzetten
Staat directory listing op je server aan, dan ziet iedereen die een map zonder indexbestand opent, dus zonder index.php of index.html, de complete bestandslijst, bijvoorbeeld in een vergeten uploadmap. Eén regel sluit dat af.
Options -Indexes
10. Dotfiles blokkeren
Bestanden als .env, .git of een oude back-up met een naam die met een punt begint horen nooit vanuit de browser bereikbaar te zijn. Deze regel blokkeert ze allemaal, met één uitzondering: de map .well-known, die externe diensten nodig hebben, bijvoorbeeld voor de verlenging van je Let's Encrypt-certificaat.
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/" [NC]
RewriteRule "(^|/)\." - [F]
</IfModule>
Zo test je het zonder je live site te riskeren
Voeg de snippets één voor één toe, niet allemaal tegelijk, en controleer na elke wijziging in de browser of je site nog laadt. Gaat er iets stuk, dan weet je precies welke regel de boosdoener was. Biedt je hoster een staging-omgeving, dan probeer je het daar eerst uit. Dat is ook de plek om deze wijzigingen te combineren met ander onderhoud, zoals het bijwerken van je plugins. Twijfel je over de syntaxis, laat het bestand dan opbouwen door de htaccess-generator voor WordPress: je vinkt de modules aan, vult je domein en paden in, en er rolt een compleet becommentarieerd bestand uit dat je kopieert of downloadt.
Klik het bij elkaar: gratis .htaccess-generator
Heb je geen zin om code over te typen? De generator zet deze tien modules voor je in elkaar, waarschuwt bij redirects die een oneindige lus opleveren en draait volledig in je browser, zonder ook maar iets naar een server te sturen.
Redirects zonder de server aan te raken
Gebruik je de .htaccess vooral voor 301-redirects, dan doet Linkjet hetzelfde vanuit je WordPress-dashboard: vijf statuscodes, een 404-monitor en lokale klikstatistiek, gratis en onder GPLv2.
Veelgestelde vragen
Wat is het .htaccess-bestand in WordPress?
Het is een configuratiebestand in platte tekst dat in de hoofdmap van je installatie staat en dat de webserver bij elke aanvraag opnieuw uitleest. Je regelt er redirects, browsercache, securityheaders en andere regels mee, zonder de globale serverconfiguratie aan te raken. Het werkt alleen op Apache en, op compatibele wijze, op LiteSpeed.
Bestaat .htaccess ook op Nginx?
Nee. Nginx leest .htaccess-bestanden helemaal niet, ook niet als je er eentje in de hoofdmap van je site zet. Dezelfde regels, dus redirects, cache en headers, horen daar rechtstreeks in het server-blok van nginx.conf, met een andere syntaxis dan die van Apache. Weet je niet welke webserver je hosting gebruikt, vraag dat dan eerst na bij je provider voordat je deze snippets toepast.
Mag ik het blok # BEGIN WordPress aanpassen?
Dat is geen goed idee. Dat blok schrijft WordPress zelf en het wordt opnieuw gegenereerd elke keer dat je de permalink-instellingen opslaat, dus elke handmatige wijziging erin kan zonder waarschuwing verdwijnen. Zet je eigen regels altijd buiten dat blok, in de praktijk er vlak boven.
Wat gebeurt er als ik een fout maak in de .htaccess?
Een syntaxfout in dit bestand, bijvoorbeeld een niet gesloten tag of een verkeerd geschreven directive, kan je hele site platleggen met een 500-fout die iedere bezoeker te zien krijgt. Maak daarom altijd eerst een kopie van het huidige bestand voordat je iets wijzigt: gaat het mis, dan zet je die kopie via FTP of het bestandsbeheer van je hoster terug en is het probleem in seconden opgelost.
Kan ik een .htaccess maken zonder zelf code te schrijven?
Ja. De gratis .htaccess-generator van hafenstudios stelt het bestand voor je samen: je vinkt de modules aan die je nodig hebt, denk aan HTTPS afdwingen, www-instelling, redirects, cache, GZIP, securityheaders of hotlinkbescherming, vult je domein en paden in en krijgt direct een becommentarieerd bestand om te kopiëren of te downloaden. De tool draait volledig in je browser, er gaat niets naar een server. Ook dan geldt: maak eerst een kopie van je bestaande bestand voordat je het vervangt.
Lopen je redirects uit de hand, dan lees je verder in ons artikel over redirects beheren in WordPress. En wil je je site verder dichttimmeren, dan is wachtwoordbeveiliging in WordPress de volgende logische stap na deze securityheaders.