{"id":6913,"date":"2020-08-02T16:12:54","date_gmt":"2020-08-02T14:12:54","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6913"},"modified":"2020-08-02T16:12:55","modified_gmt":"2020-08-02T14:12:55","slug":"nginx-cors-header-fuer-mehrere-domains-setzen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/nginx-cors-header-fuer-mehrere-domains-setzen\/","title":{"rendered":"Nginx: CORS-Header f\u00fcr mehrere Domains setzen"},"content":{"rendered":"<p>CORS soll Ressourcen davor sch\u00fctzen, unbeabsichtigt in fremde Domains eingebunden zu werden. Da die Browser domain\u00fcbergreifende Anfragen standardm\u00e4\u00dfig 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\u00fcgt es, den <strong>Access-Control-Allow-Origin<\/strong> Header entsprechend zu setzen. <\/p>\n<h2 class=\"wp-block-heading\">CORS-Header sieht nur eine Domain vor?<\/h2>\n<p>Doch was ist zu tun, wenn man mehrere Domains den Zugriff freigeben m\u00f6chte? Obwohl dieser Fall schnell eintritt (z.B. mit einem lokalen Testsystem oder einfach nur f\u00fcr mehrere Subdomains auf der gleichen Top-Level Domain), unterst\u00fctzen die CORS-Header dies leider nicht. Es besteht keinerlei M\u00f6glichkeit, um etwa mehrere Domains mit Komma getrennt anzugeben. Die Spezifikation sieht nur eine einzige Domain daf\u00fcr vor.<\/p>\n<p>Wer den Zugriff f\u00fcr mehrere Domains freigeben m\u00f6chte, muss sich daher serverseitig selbst eine L\u00f6sung bauen: Mithilfe einer Abfrage wird gepr\u00fcft, ob die anfragende Domain vertrauensw\u00fcrdig ist. Falls ja, setzen wir den Allow-Origin Header f\u00fcr diese Domain. Durch den Einsatz von regul\u00e4ren Ausdr\u00fccken und Variablen k\u00f6nnen wir dadurch dynamisch die anfragende Domain in den Header schreiben, sofern diese unserem regul\u00e4ren Ausdruck entspricht.<\/p>\n<h2 class=\"wp-block-heading\">CORS-Header f\u00fcr mehrere Domains oder Subdomains setzen<\/h2>\n<p>In der Nginx-Konfiguration der jeweiligen Lokation (im Zweifel global f\u00fcr <strong>location \/<\/strong>) l\u00e4sst sich dies mit wenigen Zeilen realisieren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-nginx\" data-line=\"\">set $cors &#039;&#039;;\nif ($http_origin ~ &#039;^https?:\/\/(local-dev\\.fritz\\.box|(forum|app)\\.u-labs.de)&#039;) {\n        set $cors &#039;true&#039;;\n}\nif ($cors = &#039;true&#039;) {\n        add_header &#039;Access-Control-Allow-Origin&#039; &#039;$http_origin&#039;;\n        add_header &#039;Access-Control-Allow-Methods&#039; &#039;GET, POST, OPTIONS&#039;;\n        add_header &#039;Access-Control-Allow-Headers&#039; &#039;&#039;;\n}<\/code><\/pre>\n<p>Dies pr\u00fcft, ob entweder von der Domain local-dev.fritz.box oder den Subdomains <strong>forum.u-labs.de<\/strong> oder <strong>app.u-labs.de<\/strong> angefragt wird. Trifft einer dieser drei F\u00e4lle zu, setzen wir den Header mit der jeweils anfragenden Domain in der Variable <strong>$http_origin.<\/strong> Die Domains und Subdomains sind nat\u00fcrlich entsprechend der eigenen Umgebung sowie dem Bedarf anzupassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CORS soll Ressourcen davor sch\u00fctzen, unbeabsichtigt in fremde Domains eingebunden zu werden. Da die Browser domain\u00fcbergreifende Anfragen standardm\u00e4\u00dfig 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\u00fcgt es, den &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6915,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[391],"tags":[825,541],"class_list":["post-6913","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-server","tag-cors","tag-nginx"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6913"}],"version-history":[{"count":1,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6913\/revisions"}],"predecessor-version":[{"id":6914,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6913\/revisions\/6914"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6915"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}