2016-02-07 5 views
3

Я прочитал https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/Как это сделать, если условие работает внутри блока местоположения в nginx conf?

Я хочу, чтобы проверить, если мое приложение рельсы уже добавил заголовок (Access-Control-Allow-Origin), и если он не затем добавить заголовок.

примеры здесь пытались объяснить поведение if состояния в nginx.conf http://agentzh.blogspot.in/2011/03/how-nginx-location-if-works.html

Но я не понял. Один из вопросов, который у меня есть, - это то, что имеется в виду, когда они говорят директиву или фазу?

Я сам пробовал некоторые вещи. Как:

location/{ 
    add_header My-outer-header '*'; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 

    if($sent_http_access_control_allow_origin != /*){ 
    add_header My-inner-header '**'; 
    } 
} 

Здесь когда, если условие выполняется, только My-inner-header установлен и не в My-outer-header.

Но когда я делаю:

location/{ 
    add_header My-outer-header '*'; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    set $a 1; 
    if($a == 1){ 
    add_header My-inner-header '**'; 
    } 
} 

Здесь $ переменная устанавливается в 1, но только My-inner-header установлен снова и не в My-outer-header.

Я хочу проверить и убедиться, что выполняются инструкции, такие как proxy_set_header или нет.

ответ

2

Я не тестировал ваш код. Я говорю только по опыту !!!

Для начала позвольте мне указать, что конфигурация Nginx НЕ совсем похожа на любое поведение ООП (объектно-ориентированное программирование). Это одно слово непредсказуемо «декларативное».

Значение ... Если у вас есть 2 оператора IF в том же блоке, что оба соответствуют критериям, ТОЛЬКО второй будет преобладать и будет выполнен.

То же самое происходит с 1, если и все предыдущие объявления в том же блоке. Некоторые переменные (не все) не будут выполняться из-за наличия IF, и nginx ожидает, что они будут повторно объявлены внутри. Это происходит в вашем примере. Давайте возьмем второй для ясности. Внутри вашего блока местоположения вы объявляете несколько значений заголовка. НО, когда выполняется инструкция IF, они НЕ выполняются (ЕСЛИ это зло в nginx действительно). Чтобы выполнить полное выполнение, вам нужно повторно объявить большую часть ваших переменных заголовка внутри и всего остального за пределами if, снова внутри оператора if, чтобы они выполнялись в случае выполнения инструкции if. ПРИМЕЧАНИЕ. Нет карты, в которой перечислены все переменные, зависящие от IF в nginx, и вы должны проверить наш conf на наличие ошибок. Некоторые переменные НЕ должны быть повторно объявлены, и в этом случае nginx сообщит об ошибке при перезапуске. Только способ выяснить, что, идет за всех и исключает сообщенные ошибочные.

Предложения

а) избегать, если в Nginx, если это возможно. Вместо этого используйте блоки местоположения. , например. Если вы просто хотите добавить переменный заголовок, как Access-Control-Allow-Origin для некоторых файлов, не используйте, если, но вместо второго блока местоположения (см ниже)

location/{ 
    // some code here 
} 
location ~* \.(eot|ttf|woff|woff2)$ { 
    add_header Access-Control-Allow-Origin *; 
} 

б) В тех случаях, когда ПЧ обязательно, используйте с осторожностью и тест-тест.Как и выше, повторное объявление всего в операторе if является хорошей практикой (как указано выше, протестируйте и исключите, какое бы повторное объявление не нарушило конфигурацию).

Удачи.