web-dev-qa-db-fra.com

Comment configurer correctement nginx Access-Control-Allow-Origin dans l'en-tête de réponse sur la base de l'en-tête Origin de la demande?

Je recherche une configuration de configuration nginx qui configure la 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 URL 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;
24
sorin

L'utilisation de if peut parfois interrompre d'autres configurations telles que try_files. Vous pouvez vous retrouver avec des 404 inattendus.

tilisez plutôt la carte

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 mal

42
phylae

Je commence à l'utiliser moi-même, et voici la ligne dans ma configuration Nginx actuelle:

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

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

De plus, vous pouvez utiliser la logique conditionnelle dans votre configuration Nginx pour spécifier une liste blanche de noms d'hôtes à autoriser. 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 mettre en liste blanche les domaines autorisés.

19
Mnebuerquo