Zezwalanie na żądania CORS w Nginx dla 404 odpowiedzi

26

Używam Nginx do obsługi plików statycznych w odpowiedzi na żądania CORS przy użyciu techniki opisanej w tym pytaniu . Jednak gdy plik nie istnieje, odpowiedź 404 nie zawiera Access-Control-Allow-Origin: *nagłówka, więc jest blokowana przez przeglądarkę.

Jak mogę wysłać Access-Control-Allow-Origin: *404 odpowiedzi?

alnorth29
źródło

Odpowiedzi:

35

Mimo że dawno temu o to pytano, kompilowałem nginx z większą liczbą modułów, ale przy nowszej wersji nginx stwierdziłem, że nie muszę niestandardowej kompilacji nginx, wystarczyło tylko dodać alwaysdyrektywę.

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

Jeśli parametr always jest określony (1.7.5), pole nagłówka zostanie dodane niezależnie od kodu odpowiedzi.

Tak dostrojona wersja nagłówków CORS :

            if ($cors = "trueget") {
                    # Tells the browser this origin may make cross-origin requests
                    # (Here, we echo the requesting origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }
Arnoldas
źródło
2
alwaysbył kluczem. Dziękuję za zwrócenie mi uwagi, oszalałem!
bgondy
11

Zakładam, że obecnie używasz add_headerdyrektywy. Dokumentacja zauważa, że ​​ustawia to tylko nagłówek dla kodów statusu 200, 204, 301, 302 i 304. Aby ustawić nagłówek kodów stanu 404, musisz użyć more_set_headersdyrektywy z modułu headers_more (może być konieczna rekompilacja nginx, aby uzyskać ten moduł). Następujące ustawiłoby nagłówek dla wszystkich kodów stanu:

more_set_headers 'Access-Control-Allow-Origin: *';

Możesz także ograniczyć go do określonych kodów stanu:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
mgorven
źródło