HTTP-headers vid användning av lastbalanserare eller Varnish

Inledning

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.

Ta reda på kundens IP-adress med X-Forwarded-For

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.

X-Forwarded-Proto med SSL-terminering

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:

  1. Begäran kommer in på port 443 till t.ex. haproxy som terminerar SSL.
  2. Skickas vidare till Varnish på port 80.
  3. Skickas vidare till Apache på port 80.
  4. Apache ser att begäran kommer in på port 80 och skickar vidare begäran till haproxy på port 443.
  5. Tillbaka till punkt 1. Denna loop blir oändlig.

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

Hittar du inte det du söker?

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.

Skicka e-post Ring 0200-23 88 00