Cloudflare-tunnel och Wordpress

23 Sep 2023

Då jag kör alla mina webbsajter, och även poddens dito, via tunnlar hos Cloudflare så är det givetvis så att saker och ting är en aning annorlunda jämfört med att köra sajten “naket” direkt mot Internet. Cloudflares tunnel fungerar som en proxy som routar trafiken via Cloudflare och i Cloudflares proxy termineras även SSL-certifikaten för webbsajterna, med mera.

Detta fungerar utan några som helst problem för sajter som denna, men för Wordpress är det annorlunda. Wordpress är, och har alltid varit, ganska uselt på att hantera SSL. En värre blir det när man ställer en webbsajt baserad på Wordpress bakom en proxy, i det här fallet tunneln via Cloudflare. Jag lyckades till slut få det att fungera när jag gjorde hela flytten till egen server hos Hetzner i somras men då jag var tvungen att rota runt lite i konfigurationen idag, och givetvis hade sönder allt eftersom jag inte mindes hur jag löst det, så bestämde jag mig för att dokumentera det för mig själv och för andra som funderar på att göra samma lösning.

Varför ska man titta på en tunnel hos Cloudflare, kanske du undrar? Om du kör en server hemma och inkommande trafik är spärrad, eller om din internetleverantör använder sig av det som kallas för Carrier-grade NAT, eller CGNAT (för att ta två exempel), så kan en gratis tunnel hos Cloudflare göra att du faktiskt kan köra din webbsajt hemma ändå.

Wordpress och Cloudflare-tunnel

När man sätter upp sin tunnel mellan Cloudflare och sin egna server så finns det ingen anledning att skicka trafiken över https (kryptering medelst SSL)-protokollet då trafiken mellan Cloudflare och din server går i en krypterad tunnel. Alltså gör man det enkelt för sig och låter webbservern hemma prata http, utan något SSL-certifikat. När man installerat sin Wordpress-sajt och fått igång tunneln mellan servern och Cloudflare kommer man upptäcka att sajten fungerar fin-fint när man besöker den, men när man går in i inställningarna och vill ändra sajtens adress till https://www.dinsajt.tldså brakar det. Du kan inte logga in administrationsgränssnittet och ställa tillbaka webbsajtens adress till http://www.dinsajt.tld och om du inte vill sätta igång och rota i databasen för att där ändra webbsajtens adress (den lagras i databasen, nämligen) så är läget en aning knepigt.

Sajten kommer kunna fortsätta att ta emot besök men när man vill logga in i det administrativa gränssnittet så får man det ökända felmeddelandet om “too many re-directs”. Detta beror på att Cloudflare-tunneln försöker leda om all trafik till https medan webbservern hemma är konfigurerad för att endast prata http. Detta gör att Wordpress vill prata https medan webbservern vill prata http, och sen går detta i en loop några gånger tills webbläsaren ger upp.

Lösningen är relativt enkel, och den matas in i wp-config.php-filen där din Wordpress-konfiguration ligger.

Dessa två rader är din räddning:

define('WP_HOME','http://www.dinsajt.tld'); define('WP_SITEURL','http://www.dinsajt.tld');

Genom att ange http i dessa två rader så kommer du kunna logga in i administrationsgränssnittet igen och kunna fortsätta arbeta med din webbsajt.

Snart kommer dock ett annat problem att uppstå, och det beror på att Wordpress tror att den kommunicerar via http och inte https vilket gör att innehållet i Wordpress inte skickas enbart över https, så-kallat mixed content. Detta löser du genom att ange följande rad i wp-config.php:

$_SERVER['HTTPS']='on';

Nu talar du om för Wordpress att den skickar ut all data via https.

Ett tredje problem kan uppstå om du installerar en plugin för exempelvis trafikanalys till din webbsajt. Du kan se felmeddelanden som detta:

Error connecting to WordPress REST API. Disable ad-blocker for this page or unblock /wp-json/wp-statistics/v2/metabox in the ad-blocker configuration.

Detta har dels med problemet ovan, mixed content, och dels med att Cloudflare har en egen brandvägg som nyper ihop så fort den misstänker att det går lite väl mycket trafik till en viss del av din webbsajt. Jättebra i normala fall men inte i detta läge.

För att komma runt detta så skapar du en regel hos Cloudflare för att slå av säkerheten för www.dinwebbsajt.tld/wp-json/*. Mina två regler för poddens webbsajt ser ut så här:

Efter att du skapat denna regel och också lagt in ändringarna i wp-config.phpså ska din sajt fungera normalt.