Если у меня есть заголовки: X_HEADER1 и X_HEADER2, я хочу отклонить все запросы, если ни один из этих заголовков не установлен или не содержит правильных значений. Каков наилучший способ сделать это?
Спасибо
Если у меня есть заголовки: X_HEADER1 и X_HEADER2, я хочу отклонить все запросы, если ни один из этих заголовков не установлен или не содержит правильных значений. Каков наилучший способ сделать это?
Спасибо
Вы можете использовать два оператора 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: Удалена точка с запятой после блока карты, так как это вызывает ошибку.
Если вы хотите разрешить 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
';
Я много исследовал, чтобы решить простую проблему: разрешить 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/info/490760/nginx-location-exact-match-matches-beyond-arguement
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/