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

У меня есть несколько виртуальных хостов, управляемых 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 по какой-то причине не любит другой мой файл. Вот почему это было странно для меня, и именно это заставило меня задать этот вопрос.


80
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;
    ...
    ...
}

Решено

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

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

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