Nginx: CORS-Header für mehrere Domains setzen

Nginx: CORS-Header für mehrere Domains setzen

CORS soll Ressourcen davor schützen, unbeabsichtigt in fremde Domains eingebunden zu werden. Da die Browser domainübergreifende Anfragen standardmäßig blockieren, kann man auch selbst davon betroffen sein. Etwa, wenn Inhalte wie ein RSS-Feed von Domain A auf Domain B dargestellt werden soll. So lange es sich hierbei nur um eine einzelne Domain handelt, genügt es, den Access-Control-Allow-Origin Header entsprechend zu setzen.

CORS-Header sieht nur eine Domain vor?

Doch was ist zu tun, wenn man mehrere Domains den Zugriff freigeben möchte? Obwohl dieser Fall schnell eintritt (z.B. mit einem lokalen Testsystem oder einfach nur für mehrere Subdomains auf der gleichen Top-Level Domain), unterstützen die CORS-Header dies leider nicht. Es besteht keinerlei Möglichkeit, um etwa mehrere Domains mit Komma getrennt anzugeben. Die Spezifikation sieht nur eine einzige Domain dafür vor.

Wer den Zugriff für mehrere Domains freigeben möchte, muss sich daher serverseitig selbst eine Lösung bauen: Mithilfe einer Abfrage wird geprüft, ob die anfragende Domain vertrauenswürdig ist. Falls ja, setzen wir den Allow-Origin Header für diese Domain. Durch den Einsatz von regulären Ausdrücken und Variablen können wir dadurch dynamisch die anfragende Domain in den Header schreiben, sofern diese unserem regulären Ausdruck entspricht.

CORS-Header für mehrere Domains oder Subdomains setzen

In der Nginx-Konfiguration der jeweiligen Lokation (im Zweifel global für location /) lässt sich dies mit wenigen Zeilen realisieren:

set $cors '';
if ($http_origin ~ '^https?://(local-dev\.fritz\.box|(forum|app)\.u-labs.de)') {
        set $cors 'true';
}
if ($cors = 'true') {
        add_header 'Access-Control-Allow-Origin' '$http_origin';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' '';
}

Dies prüft, ob entweder von der Domain local-dev.fritz.box oder den Subdomains forum.u-labs.de oder app.u-labs.de angefragt wird. Trifft einer dieser drei Fälle zu, setzen wir den Header mit der jeweils anfragenden Domain in der Variable $http_origin. Die Domains und Subdomains sind natürlich entsprechend der eigenen Umgebung sowie dem Bedarf anzupassen.

Leave a Reply