Autoriser les demandes d'origine croisée (CORS) sur Nginx pour 404 réponses

26

J'utilise Nginx pour servir des fichiers statiques en réponse aux demandes CORS en utilisant la technique décrite dans cette question . Cependant, lorsque le fichier n'existe pas, la réponse 404 ne contient pas l'en- Access-Control-Allow-Origin: *tête et est donc bloquée par le navigateur.

Comment envoyer Access-Control-Allow-Origin: *404 réponses?

alnorth29
la source

Réponses:

35

Même si cela a été demandé il y a longtemps, je compilais nginx avec plus de modules, mais avec une version plus récente de nginx, j'ai trouvé que je n'ai pas besoin de compiler nginx sur mesure, tout ce dont j'avais besoin était d'ajouter une alwaysdirective.

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

Syntax: add_header name value [always];

Si le paramètre always est spécifié (1.7.5), le champ d'en-tête sera ajouté quel que soit le code de réponse.

Donc, une version optimisée des en- têtes 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
la source
2
alwaysétait la clé. Merci de me l'avoir signalé, je devenais fou!
bgondy
11

Je suppose que vous utilisez actuellement la add_headerdirective. La documentation note que cela définit uniquement l'en-tête pour les codes d'état 200, 204, 301, 302 et 304. Pour définir l'en-tête pour les codes d'état 404, vous devrez utiliser la more_set_headersdirective du module headers_more (vous devrez peut-être recompiler nginx pour obtenir ce module). Les éléments suivants définiraient l'en-tête de tous les codes d'état:

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

Vous pouvez également le limiter à des codes d'état spécifiques:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
mgorven
la source