mod_rewrite, Let's Encrypt en een vervelend probleem

Ik ben een fervent aanhanger van Let’s Encrypt, en van het versleutelen van verkeer in het algemeen. Al mijn publieke en private sites hebben dus een certificaat, dat bij voorkeur automatisch vernieuwd wordt.

Maar al een tijdje is er een probleem met één van die sites (een Mattermostserver achter een Apache reverse proxy), waarbij het hernieuwen van het certificaat (via cron) om de één of andere reden faalt. Op zich was er met DNS en de configuratie van de webserver niets mis: die was identiek aan alle andere systemen.

Het enige verschil was dat er een groot aantal RewriteRule’s geconfigureerd stonden, met daarin een aantal catch-all-regels. Nu is het zo dat ik altijd een RewriteRule toevoeg voor Let’s Encrypt, om alle aanvragen voor de acme-challenge-token op een centrale plaats te bewaren:

RewriteRule ^/\.well-known/acme-challenge/(.*)$ /var/letsencrypt/.well-known/acme-challenge/$1

Door een te snelle lezing van de documentatie was ik vergeten dat Apache alle regels die matchen uitvoert, niet alleen de eerste. Hierdoor werden alle aanvragen doorgestuurd naar de achterliggende Mattermostserver, die, terecht, antwoordde met 403 Forbidden. En dan werkt Let’s Encrypt natuurlijk niet.

De oplossing staat gelukkig ook in de documentatie: de [L]-flag zorgt ervoor dat de huidige regel meteen ook de laatste regel is die wordt geïnterpreteerd.

RewriteRule ^/\.well-known/acme-challenge/(.*)$ /var/letsencrypt/.well-known/acme-challenge/$1 [L]

Et voilà, alle requests van Let’s Encrypt worden meteen correct doorgestuurd, en de andere regels worden zelfs niet meer bekeken. En ik heb mijn certificaten terug!