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.