Comment configurer correctement nginx Access-Control-Allow-Origin dans l'en-tête de réponse basé sur L'en-tête D'origine de la requête?

je suis à la recherche d'une configuration de Nginx config qui configure le Access-Control-Allow-Origin à la valeur reçue dans le Origin.

Il semble que le * la méthode ne fonctionne pas avec Chrome et les URLs multiples ne fonctionnent pas avec Firefox car elles ne sont pas autorisées par la spécification CORS.

Jusqu'à présent, la seule solution est de configurer le Access-Control-Allow-Origin à la valeur reçue dans l'origine (Oui une validation pourrait être implémentée).

La question est de savoir comment faire cela dans nginx, de préférence sans installer d'extensions supplémentaires.

set $allow_origin "https://example.com"
# instead I want to get the value from Origin request header
add_header 'Access-Control-Allow-Origin' $allow_origin;
17
demandé sur sorin 2013-01-24 14:40:03

2 réponses

en utilisant if peut parfois casser d'autres config comme try_files. Vous pouvez vous retrouver avec une erreur 404.

utilisez map à la place de

map $http_origin $cors_header {
    default "";
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri $uri/ /index.php;
    }
    ...
 }

Si c'est le mal

29
répondu phylae 2017-04-13 12:13:41

j'utilise moi-même, et c'est la ligne dans mon Nginx configuration:

add_header 'Access-Control-Allow-Origin' "$http_origin";

définit un en-tête pour autoriser l'origine de la requête comme seule origine autorisée. Donc, d'où que vous veniez est le seul endroit autorisé. Donc, il ne devrait pas être très différent de permettre"*", mais il semble plus spécifique du point de vue du navigateur.

en outre, vous pouvez utiliser la logique conditionnelle dans votre configuration Nginx pour spécifier une liste blanche de noms d'hôtes à permettre. Voici un exemple de https://gist.github.com/Ry4an/6195025

if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) {
  add_header Access-Control-Allow-Origin "$http_origin";
}

j'ai l'intention d'essayer cette technique sur mon propre serveur pour blanchir les domaines autorisés.

16
répondu Mnebuerquo 2014-01-15 00:46:42