为什么在使用OpenResty / nginx lua进行子请求之前必须读取请求正文?

我们将部分nginx访问控制委托给一个独立的服务,并使用access_by_lua_file和lua-resty-hawk以及子请求来验证请求。

文档如下所述:

在开始子请求之前,您应该始终阅读请求正文(通过调用ngx.req.read_body或配置lua_need_request_body)。

最初我们忽略了这个细节,事情看起来已经工作了。我正在尝试找到更多有关此要求的背景信息,但没有找到。

在阅读正文之前授权请求将很好,因为如果客户端只是试图上传各种垃圾并填满我们的磁盘,我们可能能够提前终止连接并防止一种DoS攻击。

为什么会有这个限制?

点赞
用户6088837
用户6088837

由于没有人回答这个问题,我想通过引用官方文档来澄清原因。

always_forward_body 设置为true时,当前(父)请求的请求正文(request body)将总是转发到正在创建的子请求,如果未指定body选项。ngx.req.read_body() 或 lua_need_request_body将读取的请求体将被直接转发到子请求,而不是在创建子请求时将整个请求体数据复制(无论请求体数据是否被缓存在内存缓冲区或临时文件中)。默认情况下,此选项为false,当未指定body选项时,仅在子请求使用PUT或POST请求方法时才转发当前(父)请求的请求正文。

简而言之,如果未指定body选项,则可能使用当前请求的正文,因此需要先读取请求正文。

正如您所看到的,这并不是强制性的,所以在您的情况下工作正常。

2017-07-26 08:01:58