Работа модуля CORS#

Директива cors предназначена для обработки preflight-запросов.

Ниже приведен пример использования механизма для обработки CORS запросов:

cors:
  origin_wl: valid-origins.data
  method_wl:
    - post
    - get
    - put
    - delete
  deny_status: 403
set_output_headers:
  - headers:
    - 'Access-Control-Allow-Origin: $http_Origin'
    conditions: origin.cond
  - headers:
    - 'Access-Control-Allow-Credentials: true'
    conditions: origin.cond
  - headers:
    - 'Access-Control-Allow-Credentials: true'
    conditions: no_origin_set_acac.cond
set_input_headers:
  - headers:
    - 'X-Forwarded-For: $remote_addr'
  - headers:
    - 'X-Forwarded-For: $orig_xff'
    conditions: xff.cond
    set_var: '$orig_xff $http_x_forwarded_for'

Подробное описание используемых параметров приведено в разделе «Пaраметр modifiers».

Формат содержимого файла с условиями приведен ниже:

Операнды

Назначение

Проверяемый ключ

Допустимые операторы

Проверяемое значение

Использование переменной в проверяемом значении

Примеры использования

method

Проверка метода запроса.

нет

==
!=
in
!in

да

нет

method == POST
method in POST,GET,PUT

headers_in
headers_out

Проверка наличия входящих/исходящих headers.

нет

contains
!contains

да

нет

headers_in contains Origin
headers_out !contains Content-type

header_in
header_out

Проверка значений входящих/исходящих headers.

да

==
!=
in
!in
inwl
inwl_re
inwl_recl
!inwl
!inwl_re
!inwl_recl
~
!~
~*
!~*

да

да, для операторов ==, !=, in, !in

header_in User-Agent in Mozilla,Firefox
header_in User-Agent !in Mozilla,Firefox
header_in User-Agent == Opera
header_in Origin inwl /path/to/whitelist
header_out Set-Cookie ~ ^UFS-SESSION=\d+$

variable

Проверка значения переменной.

да

==
!=
in
!in
inwl
inwl_re
inwl_recl
!inwl
!inwl_re
!inwl_recl
~
!~
~*
!~*

да

да, для операторов ==, !=, in, !in

variable $remote_addr ~ ^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$

Файл может содержать много условий, но при не выполнении хотя бы одного условия, заголовок не выставляется.

Каждое из условий может выполнять проверку операнда из таблицы выше.

Описание операторов приведено в таблице ниже:

Оператор

Описание

Пример

Комментарий

==

посимвольное равенство

!=

посимвольное неравенство

in

вхождение в перечисление

in POST,GET,PUT

значения указываются через разделитель «,» без пробелов

!in

отсутствие вхождения в перечисление

!in POST,GET,PUT

значения указываются через разделитель «,» без пробелов

inwl
inwl_re
inwl_recl

вхождение в белый лист
белый лист с использованием regex
белый лист с использованием regex без учета регистра

inwl /path/to/whitelist
inwl_re /path/to/whitelist
inwl_recl /path/to/whitelist

!inwl
!inwl_re
!inwl_recl

отсутствие вхождения в белый лист
белый лист с использованием regex
белый лист с использованием regex без учета регистра

!inwl /path/to/whitelist
!inwl_re /path/to/whitelist
!inwl_recl /path/to/whitelist

~

регулярное выражение с учетом регистра

~ ^UFS-SESSION=\d+$

!~

негативное регулярное выражение с учетом регистра

~*

регулярное выражение без учета регистра

contains

содержит значение

!contains

не содержит значение

Ниже приведены примеры файлов, используемых в указании условий.

valid-origins.data

front.ift-node2.testonline.company.ru
https://front.ift-node2.testonline.company.ru
https://www.node1.online.company.ru
https://nginx-web.ift-node2.testoline.company.ru
front.ift-node5.testonline.company.ru
https://front.ift-node5.testonline.company.ru
https://front.ift-node5.testonline.company.ru:1111

origin.cond

method in POST,GET,OPTIONS,PUT,DELETE
headers_in contains Origin
header_in Origin inwl valid-origins.data
{# necessary to render a resource with a sowa-config #}
{% if conf is defined and conf.t_checkExists(current_path + "/valid-origins.data") %}{% endif %}

xff.cond

method in POST,GET
variable $orig_xff !~ ^$
variable $orig_xff ~ ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
{% if uko_web_xff_use_wl == True %}
variable $remote_addr inwl_re valid-ip.data
{# necessary to render a resource with a sowa-config #}
{% if conf is defined and conf.t_checkExists(current_path + "/valid-ip.data") %}{% endif %}
{% endif %}

valid-ip.data

111.111.111.111
222.222.222.222