NGINX: utilisation de regex à partir de la variable

J’essaie d’implémenter CORS dans ma définition NGINX vhost, basée sur la configuration de http://enable-cors.org/server_nginx.html . Ce que j’essaie de faire, c’est d’affecter une variable $ valid_cors_origin dans ma définition vhost, puis d’inclure un fichier différent qui gère toute la validation CORS, comme ceci:

location / { ... $valid_cors_origin = "foobar"; include cors_handling; } 

alors que j’ai retiré l’environnement de location de l’exemple de enable-cors.org. Dans cette configuration, ce qui suit fonctionne dans cors_handling :

 if ($http_origin = "${valid_cors_origin}"){ set $cors "true"; } 

tant que j’ajoute l’en-tête Origin: foobar à ma demande, évidemment.

Dans l’exemple de enable-cors.org, ils utilisent une expression régulière pour correspondre à $http_origin . Je veux pouvoir faire la même chose et, par conséquent, atsortingbuer une expression régulière à la variable $valid_cors_origin . Le problème est que la variable ne semble pas être évaluée dans l’instruction if. Jusqu’à présent, j’ai essayé ce qui suit, sans aucune chance:

 $valid_cors_origin = "/(foo|bar)/"; if ($http_origin *~ $valid_cors_origin){ set $cors "true"; } 

me laisse avec

 [notice] 43797#0: *1 $valid_cors_origin does not match "foobar" 

Essayer de forcer l’évaluation de chaîne:

 if ($http_origin *~ "${valid_cors_origin}"){ set $cors "true"; } [notice] 43797#0: *1 "${valid_cors_origin}" does not match "foobar" 

Et d’autres variantes dans lesquelles j’ai remplacé $valid_cors_origin par just /foo/ , mais comme cela ne semble pas être évalué, je pense que ce que $valid_cors_origin à $valid_cors_origin n’a pas d’importance.

Est-ce même possible dans NGINX et / ou existe-t-il d’autres moyens modulaires pour résoudre ce problème? Exigence de base: je veux pouvoir gérer entièrement mes origines valides à partir du fichier vhost et conserver la configuration de cors_handling aussi générique que possible.

Mise à jour : J’ai enfin eu le temps de tester la solution proposée par @cnst, et cela fonctionne très bien. Juste pour être complet, j’ai enlevé le chèque pour $ http_origin du fichier cors_handling et déplacé le chèque vers le vhost lui-même, où je peux le faire:

 if ($http_origin ~* (regex|for|my|httporigin)) { set $cors "true"; } include cors_handling; 

Pourquoi avez-vous besoin d’une variable intermédiaire avec laquelle vous devez comparer $http_origin ?

Vous pouvez plutôt utiliser directement la directive if comme vous le faites et, si nécessaire, placer la directive entière dans un fichier séparé, puis l’ include à la place de l’endroit où vous voulez que $http_origin évalué.

Ou, si vous avez déjà cors_handling dans un fichier séparé, déplacez simplement l’en-tête if (avec comparaison avec $http_origin ) vers votre location actuel (ou même le server entier).

Vous ne pouvez évidemment pas faire ce que vous essayez de faire de la même manière que vous avez essayé, mais ces alternatives semblent tout à fait suffisantes et raisonnables.