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

Je recherche une configuration de configuration nginx qui configure l' Access-Control-Allow-Origin à la valeur reçue dans Origin .

Il semble que la méthode * ne fonctionne pas avec Chrome et que les URL multiples ne fonctionnent pas avec Firefox car elle n'est pas autorisée par la spécification CORS.

Jusqu'à présent, la seule solution est de configurer 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 procéder 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; 

En utilisant if peut parfois casser d'autres configurations telles que try_files . Vous pouvez vous retrouver avec 404 inattendus.

Utilisez 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 le mal

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

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

Cela définit un en-tête pour permettre l'origine de la requête comme la seule origine autorisée. Donc, où que vous venez, c'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 des 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 dans mon propre serveur pour répertorier les domaines autorisés.