2014-01-07 4 views
1

Я пытаюсь реализовать CORS в моем определении NAT-хоста NGINX на основе конфигурации от http://enable-cors.org/server_nginx.html. То, что я пытаюсь добиться, чтобы присвоить переменный $ valid_cors_origin в моем определении ВХоста, а затем включить другой файл, который обрабатывает все проверки CORS, например так:NGINX: using regex from variable

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

в то время как я раздел location среды от пример из enable-cors.org. В этой установке, следующие работы в cors_handling:

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

до тех пор, как я добавить заголовок Origin: foobar к моей просьбе, очевидно.

В примере с сайта enable-cors.org они используют регулярное выражение для соответствия $http_origin. Я хочу иметь возможность сделать то же самое, и поэтому вам нужно назначить регулярное выражение переменной $valid_cors_origin. Проблема в том, что переменная, по-видимому, не оценивается в выражении if. До сих пор я попытался следующие, без везения:

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

оставляет меня с

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

Попытка заставить оценки строки:

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

и некоторые другие варианты, в которых я заменил $valid_cors_origin только /foo/, но поскольку он, похоже, не оценивается, я думаю, что не имеет значения, что я назначаю $valid_cors_origin.

Возможно ли это в NGINX и/или существуют другие модульные способы решения этой проблемы? Основное требование: я хочу иметь возможность полностью управлять своим действительным происхождением из файла vhost и поддерживать конфигурацию cors_handling как можно более общей.

Обновление: У меня есть время, чтобы проверить предлагаемое решение от @cnst, и оно отлично работает. Просто чтобы быть полным, я убрал чек на $ http_origin из файла cors_handling и переместил чек сам виртуальный хост, где я могу это сделать:

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

ответ

0

Почему вам нужно промежуточную переменную, против которой вы должны сравните $http_origin?

Вы могли бы вместо того, чтобы непосредственно использовать if директиву, как вы делаете, и, в случае необходимости, поместить всю директиву в отдельный файл, а затем include его в месте, где вы хотите $http_origin оцененного.

Или, если у вас есть все cors_handling уже в отдельном файл, просто переместить заголовок if (со сравнением с $http_origin) в реальном location (или даже всех server).

Вы, очевидно, не можете делать то, что вы пытаетесь сделать так же, как пытались, но эти альтернативы кажутся вполне достаточными и разумными.

+0

Я мог бы переместить чек на $ http_origin в среду местоположения, если я жестко задаю $ cors для «true» в примере enable-cors.org.Я попробую это и опубликую свои результаты. – skoef