nginx, якщо оператор у внутрішньому місці повертає 404


11

Наступний блок

location / {
    if ($http_origin ~* (https?://[^/]*\.example\.com(:[0-9]+)?)) {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
    }
    try_files $uri $uri/ /index.php?$args;
}

… Викликає 404, оскільки наведений вище код ніколи не досягає try_filesдирективи, тому:

  1. Це пов’язано з ifIsEvil з nginx?

  2. Якщо це так, то чи є інший спосіб перевірити тестування http_origin, не використовуючи оператор if?

Я спробував це з nginx> 1.4 (1.4.6, 1.7, 1.7.8).


1) Це саме з прикладів "якщо є зло". 2) Ви можете використовувати mapабо використовувати ifпоза місцем розташування.
Олексій Десять

@AlexeyTen, чи можете ви навести приклад того, як використовувати ifпоза блоком розташування?
Еліран Малька

Відповіді:


19

Я б використав map:

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;
    }
    ...
 }

Що робити, якщо дозволені джерела повинні бути різними для кожного сервера?
Кріс Мартін

3
Використовуйте кілька maps з різними змінними
Олексій Десять
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.