Почему мы должны читать тело запроса перед выполнением подзапроса с использованием OpenResty/nginx lua?

Мы частично делегируем управление доступом nginx отдельному сервису и используем access_by_lua_file и lua-resty-hawk и подзапросы для аутентификации запроса.

В документах говорится:

Вы всегда должны читать тело запроса (вызывая ngx.req.read_body или настроив lua_need_request_body) перед инициированием подзапроса.

Изначально мы упустили эту деталь, но казалось, все работает. Я пытался найти дополнительную справочную информацию об этом требовании, но ничего не нашел.

Было бы неплохо авторизовать запрос перед чтением тела, так как мы можем досрочно разорвать соединение и предотвратить своего рода DoS-атаку, если клиенты просто пытаются закачать всякий хлам и заполнить наш диск.

Почему введено это ограничение?


person Dobes Vandermeer    schedule 06.11.2015    source источник
comment
auth_request предназначен для предварительной аутентификации без чтения всего тела. Ответ аутентификации также можно кэшировать, чтобы предотвратить избыточные запросы от аутентифицированного пользователя.   -  person Anatoly    schedule 07.11.2015


Ответы (1)


Поскольку никто не ответил на этот вопрос, я хочу уточнить причину, просто процитировав официальную документацию.

always_forward_body при значении true тело запроса текущего (родительского) запроса всегда будет пересылаться в создаваемый подзапрос, если параметр body не указан. Тело запроса, прочитанное с помощью ngx.req.read_body() или lua_need_request_body, будет напрямую перенаправлено в подзапрос без копирования всех данных тела запроса при создании подзапроса (независимо от того, буферизуются ли данные тела запроса в буферах памяти или во временных файлах). . По умолчанию этот параметр равен false, и если параметр body не указан, тело текущего (родительского) запроса пересылается только тогда, когда подзапрос использует метод запроса PUT или POST.

Короче говоря, если тело параметра не указано, может использоваться тело текущего запроса, поэтому вам нужно сначала прочитать тело запроса.

Как видите, это не обязательно, поэтому в вашем случае все работает.

person mononoke    schedule 26.07.2017