Как я могу переместить валидацию в общий файл и импортировать ее?

У меня есть несколько виртуальных хостов, управляемых Nginx.

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

location / {
    if ($http_my_request_header_name != "<mytoken>") {
        return 406;
    }
}

И это работает, как и ожидалось. Однако я намерен сделать это решение более элегантным и создать новый файл конфигурации с именем common.conf и вместо вставки одного и того же кода во все виртуальные хосты включить этот общий файл как:

include conf.d/common.conf;

Тем не менее, все мои попытки потерпели неудачу:

Первая попытка

Вставьте условное выражение if и оставьте директиву location в виртуальном хосте, который будет include файлом. Ошибка, которую я получил, сообщала мне в журналах, что у меня не может быть if в файле.

Вторая попытка

Я переместил весь

location / {
    if ($http_my_request_header_name != "<mytoken>") {
        return 406;
    }
}

в общий файл и заменил его на include в конфигах виртуального хоста. Ошибка, которую я получил, говорила мне, что мне нужно обернуть директиву server вокруг директивы location.

Третья попытка

Я обернул директиву сервера вокруг директивы моего местоположения, но это также привело к ошибке. У меня больше нет ошибки, потому что с тех пор я уничтожил сервер и воссоздал его. Но если нужно точное сообщение об ошибке, дайте мне знать, я воспроизведу его и поделюсь здесь.

Вопрос

Как я могу создать общий файл конфигурации, который будет проверять заголовок запроса и включать его в несколько конфигураций виртуального хоста?

РЕДАКТИРОВАТЬ

Ввиду ответа Рахула Шармы я предоставляю дополнительную информацию о текущей попытке. Вот как сейчас выглядит основная конфа:

server {
...
    include conf.d/common.conf;
...
}

а include является прямым дочерним элементом директивы server, то есть вокруг строки include. Earlier, instead of the include` больше ничего не оборачивается, основная конфа имела свое содержимое, например

server {
...
    location / {
        if ($http_my_request_header_name != "<mytoken>") {
            return 406;
        }
    }
...
}

и это сработало. Я буквально переместил location / в файл common.conf и заменил его на include. Итак, Nginx по какой-то причине не любит другой мой файл. Вот почему это было странно для меня, и именно это заставило меня задать этот вопрос.

Ваша вторая попытка должна сработать. Если вы получаете сообщение об ошибке, значит, что-то еще происходит с настройками. Вставьте точную ошибку, с которой вы столкнулись, вместе с содержимым файлов nginx.conf и common.conf.

Rahul Sharma 05.10.2022 13:31

@RahulSharma снова попробовал вторую попытку, вот что я вижу в журналах ошибок: 2022/10/05 16:00:31 [emerg] 1843#1843: "location" directive is not allowed here in /etc/nginx/conf.d/common.conf:1. По сути, ему не нравится, что в моем common.conf есть директива location, и, вероятно, что-то должно быть обернуто вокруг нее. Но у меня очень ограниченные знания о синтаксисе nginx, и я не знаю, чего не хватает.

Lajos Arpad 05.10.2022 18:05
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Валидация полей ввода для базовой формы React
Валидация полей ввода для базовой формы React
В одном из моих проектов MERN Stack есть форма с именем, фамилией, контактным номером, адресом, электронной почтой, датой рождения, номером NIC, весом...
Пользовательские правила валидации в Laravel
Пользовательские правила валидации в Laravel
Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей...
0
2
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что содержимое вашего файла conf.d/common.conf:

location / {
    if ($http_my_request_header_name != "<mytoken>") {
        return 406;
    }
}

Ошибка

Директива location не разрешена здесь, в /etc/nginx/conf.d/common.conf.

это потому, что, вероятно, ваше утверждение include внутри основного nginx.conf неуместно. Строка include conf.d/common.conf; должна быть внутри блока server, чтобы это работало так:

server {
    ...
    ...
    include conf.d/common.conf;
    ...
    ...
}

К сожалению, это не проблема. Я отредактировал свой вопрос с дополнительной информацией, показав, что я переместил этот код из основной конфигурации и заменил его включением, и именно тогда это начало не работать.

Lajos Arpad 05.10.2022 19:49

Это странно. Можете ли вы показать все содержимое вашего файла nginx.conf?

Rahul Sharma 06.10.2022 04:34

К сожалению, это конфиденциально. Но если бы был рабочий пример делегирования location в другой файл и включения его в конфиг, это, конечно, был бы правильный ответ. Итак, если вы решите проигнорировать мой пример и указать мне на доказательство концепции этой работы, то это будет правильный ответ. Ваш текущий ответ очень логичен, но решает проблему, отличную от моей.

Lajos Arpad 06.10.2022 12:56
Ответ принят как подходящий

Оказалось, что в nginx.conf была строчка

include /etc/nginx/conf.d/*.conf;

который включал common.conf в другом месте, о котором я не знал, и во втором месте код внутри common.conf был недействителен.

Другие вопросы по теме