Det finns några grundläggande inställningar du kan behöva göra i dina HTTP-headers när du använder eller tänker använda lastbalanserare eller en Varnish-proxy samt SSL-terminering.
Som exempel kräver Klarna och flera andra betalningsleverantörer att kunna få fram kundens IP-adress.
Vanligt är då att i PHP använda sig av: $_SERVER['REMOTE_ADDR']
. Det fungerar dock inte när du använder Varnish eller vår lastbalanserare. Värdet i REMOTE_ADDR
blir IP-adressen till Varnish/lastbalanseringsnoden.
För att komma runt detta är det standard att använda sig av headern X-Forwarded-For
. Formatet är enligt nedan:
X-Forwarded-For: client, proxy1, proxy2
Det vill säga kundens/besökarens IP-adress är det första i raden, efteråt kommer de olika hoppen. Istället för att använda till exempel...
<?php echo $_SERVER['REMOTE_ADDR']; ?>
... använd samt filtrera ut besökarens IP-adress med:
<?php
$ipadresses = array_values(array_filter(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR'])));
echo $ipadresses[0];
?>
I andra programmeringsspråk gäller samma princip, i stället för att titta på vilken IP-adress anslutningen kommer ifrån måste du titta på de HTTP headers som skickas med requesten.
Ett exempel där X-Forwarded-Proto används är om du använder en redirect-regel som skickar vidare all trafik som går in på port 80
till 443
(för att på så vis kräva krypterad trafik). Det är vanligt att använda sig av RewriteCond %{HTTPS} off
detta skapar dock problem om t.ex. en lastbalanserares backend går mot port 80. Då kommer alltid förfrågan till port 80
. Dvs logiken vi skrev kommer alltid matcha vilket resulterar i en redirect loop.
Vid en redirect loop blir flödet följande:
443
till t.ex. haproxy som terminerar SSL.80
.80
.80
och skickar vidare begäran till haproxy på port 443
.Här kommer X-Forwarded-Proto in. Vi skickar med en ny header när trafik kommer ifrån lastbalanseraren med aktiverat SSL: X-Forwarded-Proto: https
. Därför behöver du skriva om rewrite-regeln för att göra ett undantag om headern inkluderar X-Forwarded-Proto: https
och tillåta trafiken, så att endast kunder som besökte port 80
vidarebefordras till SSL.
Här är ett exempel hur en redirect går till med X-Forwarded-Proto
istället:
# MUST be SSL
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
Det som sker är att du kollar om X-Forwarded-Proto
har värdet HTTPS, det vill säga att trafiken passerat en TLS anslutning. Om så är fallet så behöver vi inte köra en redirect. Båda dessa headers är de facto standard
så denna artikel är användbar även om du hostar din egen miljö.
Kontakta oss gärna för mer information. Vi hjälper dig att komma fram till den bästa lösningen för dina behov.