Рейтинг:3

Нельзя ли иметь условные заголовки в Nginx?

флаг cn

В настоящее время я пытаюсь вернуть набор заголовков 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).

флаг cn
Просто для полноты я нашел хакерский способ сделать эту работу, скопировав раздел CORS в раздел местоположения (где, если это разрешено) и снова в условное OTPIONS, чтобы вернуть заголовки CORS и в этом случае, но я не хочу использовать это в производстве: P
Рейтинг:3
флаг us

я не знаю more_set_headers принимает пустые строки. Если он принимает, вы можете определить несколько карта заявления:

карта $ http_origin $ cors_methods {
    По умолчанию "";
    ~^https?://(some.domain|some.other.domain|other-allows.domain) Access-Control-Allow-Methods: GET,POST,PATCH,PUT,DELETE,OPTIONS;
}

карта $http_origin $cors_origin {
    По умолчанию "";
    ~^https?://(some.domain|some.other.domain|other-allows.domain) Access-Control-Allow-Origin: $http_origin;
}

А затем используйте это:

more_set_headers $cors_methods;
more_set_headers $cors_origin;
флаг cn
Да, это то, что я пытаюсь упомянуть с помощью функции карты. Однако я надеялся на более простой способ включить/отключить все заголовки сразу, но, вероятно, его нет.
флаг cn
Также я понял, что функцию карты нельзя использовать в блоке сервера, только в блоке http.
флаг us
Да, `map` должен быть определен на уровне `http`, но это не влияет на его полезность.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.