Nginx: запрос отклонения, если заголовок отсутствует или неверен
Если у меня есть заголовки: X_HEADER1 и X_HEADER2, я хочу отклонить все запросы, если ни один из этих заголовков не установлен или не содержит правильных значений. Каков наилучший способ сделать это?
Спасибо
Ответы
Ответ 1
Вы можете использовать два оператора 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;
}
, это сначала отображает значение заголовка в том, хорошо ли оно или нет, а затем проверяет, поддерживается ли переменная.
EDIT: Удалена точка с запятой после блока карты, так как это вызывает ошибку.
Ответ 2
Если вы хотите разрешить 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
';
Ответ 3
Я много исследовал, чтобы решить простую проблему: разрешить proxy_pass, только если в заголовке запроса есть определенный токен. Я попробовал все ответы здесь, и ничего не получилось так, как мне понравилось. Мое окончательное решение:
location /api {
proxy_http_version 1.1;
if ($http_authorization != "Bearer 1234") {
return 401;
}
proxy_pass http://app:3000/;
}
Ссылки:
NGINX не равно
nginx - читать пользовательский заголовок с вышестоящего сервера
https://serverfault.com/info/490760/nginx-location-exact-match-matches-beyond-arguement
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/