Nginx: отклонить запрос, если заголовок отсутствует или неправильный
Если у меня есть заголовки: X_HEADER1 & X_HEADER2, я хочу отклонить все запросы, если какой-либо из этих заголовков не установлен или не содержит правильных значений. Каков наилучший способ сделать это?
Спасибо
2 ответа
Вы можете использовать два оператора IF либо до, либо в блоке местоположения для проверки заголовков, а затем вернуть код ошибки 403, если он присутствует. В качестве альтернативы, вы можете использовать эти операторы IF для перезаписи в определенный блок местоположения и запретить все в этом месте:
if ($http_x_custom_header) {
return 403;
}
Ссылка:
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
https://nginx.org/en/docs/http/ngx_http_access_module.html
Добавление более подробной информации за комментарий / запрос:
if ($http_x_custom_header) {
return 405;
}
это выглядит, чтобы увидеть, существует ли заголовок
Если вы хотите проверить, существуют ли правильные значения, вам сначала нужно сопоставить правильные значения с переменной.
map $http_x_header $is_ok {
default "0";
Value1 "1";
Value2 "1";
Value3 "1";
}
if ($is_ok) {
return 405;
}
это сначала сопоставляет значение заголовка с тем, действительно ли оно в порядке, затем проверяет, является ли переменная в порядке.
РЕДАКТИРОВАТЬ: Удалена точка с запятой после блока карты, так как это вызывает ошибку.
Я много исследовал, чтобы решить простую проблему: разрешить proxy_pass только в том случае, если в запросе есть конкретный токен в заголовке. Я перепробовал все ответы здесь, и ничего не помогло, как мне понравилось. Мое окончательное решение:
location /api {
proxy_http_version 1.1;
if ($http_authorization != "Bearer 1234") {
return 401;
}
proxy_pass http://app:3000/;
}
Ссылки:
nginx - читать пользовательский заголовок с вышестоящего сервера
https://serverfault.com/questions/490760/nginx-location-exact-match-matches-beyond-arguement
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
Если вы хотите разрешить HTTP-запросы только на основе некоторых допустимых значений заголовка, которые помещены в заголовок ответа, одним из возможных способов является использование инструмента OpenResty для применения таких ограничений.
В следующем примере разрешается доступ только к запросам, имеющим значения "name1" или "name2" для header1:
header_filter_by_lua '
local val = ngx.header["header1"]
if val then
if (val ~= "name1") and (val ~= "name2") then
return ngx.exit(400)
end
end
';