В настоящее время я пытаюсь вернуть набор заголовков CORS только условно, используя Nginx. Сначала это казалось простой задачей, так как у меня уже был этот рабочий конфиг:
вышестоящее API-приложение {
сервер unix:/tmp/api-app.sock fail_timeout=0;
}
сервер {
слушать 80;
# [другие серверные вещи...]
# Заголовки CORS добавлены ко ВСЕМ ответам этого сервера (необходимы для всех запросов)
more_set_headers 'Access-Control-Allow-Methods: GET,POST,PATCH,PUT,DELETE,OPTIONS';
more_set_headers 'Access-Control-Allow-Origin: *';
more_set_headers 'Access-Control-Allow-Credentials: true';
more_set_headers 'Метод-запроса-управления-доступом: GET,POST,PATCH,PUT,DELETE,OPTIONS';
more_set_headers 'Access-Control-Request-Headers: Content-Type';
more_set_headers 'Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept,Session-Id,Role-Id,Visitor-Id,X-Window-Location';
more_set_headers 'Access-Control-Expose-Headers: X-Total-Entries, X-Total-Pages, X-Page, X-Page, X-Folder-Hierarchy';
место расположения / {
# Для запроса OPTIONS возвращаются только указанные выше заголовки и не возвращается содержимое (также разрешается их кеширование)
если ($ request_method = 'ВАРИАНТЫ') {
# кеш выше заголовков (Access-Control)
add_header 'Access-Control-Max-Age' 600;
# установить длину и тип содержимого просто для верности:
add_header 'Длина контента' 0;
add_header 'Content-Type' 'текст/обычная кодировка = UTF-8';
# вернуть 204 - нет содержимого
вернуть 204;
}
# Перенаправить запросы в реальное приложение (если все вышеперечисленные условия не совпадают)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Хост $http_host;
прокси_перенаправление выключено;
proxy_read_timeout 35;
proxy_send_timeout 35;
proxy_pass http://api-приложение;
}
}
Поэтому я просто хотел изменить раздел заголовка CORS на s.th. как это
# ...
установить $cors '';
if ($http_origin ~ '^https?://(some.domain|some.other.domain|other-allows.domain)') {
установить $cors «истина»;
}
если ($cors = 'истина') {
more_set_headers 'Access-Control-Allow-Methods: GET,POST,PATCH,PUT,DELETE,OPTIONS';
more_set_headers 'Access-Control-Allow-Origin: $http_origin';
more_set_headers 'Access-Control-Allow-Credentials: true';
more_set_headers 'Метод-запроса-управления-доступом: GET,POST,PATCH,PUT,DELETE,OPTIONS';
more_set_headers 'Access-Control-Request-Headers: Content-Type';
more_set_headers 'Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept,Session-Id,Role-Id,Visitor-Id,X-Window-Location';
more_set_headers 'Access-Control-Expose-Headers: X-Total-Entries, X-Total-Pages, X-Page, X-Page, X-Folder-Hierarchy';
}
место расположения / {
# ...
Однако нгинкс -т
быстро сказал мне more_set_headers
нельзя использовать в операторе if. Также не может add_header.
Я понял, что в место расположения
разделе это сработает. Но я уже знал, что это не будет хорошим решением, как мы все знаем. если это зло в разделах местоположения nginx. И я был прав, так как тогда заголовки CORS будут потеряны для запроса OPTIONS, у меня уже был случай if (нормальный, когда он возвращается).
Я также наткнулся на вариант использования Nginxs. функция карты. Но это работает, только если я хочу изменить значения заголовков, а не если я хочу добавить целый блок заголовков.
Итак, мой вопрос заключается в следующем:
Есть ли способ добавить заголовки условно (без использования карты) и вне блока местоположения? В идеале можно включить раздел CORS, чтобы я мог использовать его на нескольких серверах (например, на сайтах nginx).