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