为什么我们必须在使用OpenResty/nginx lua执行子请求之前阅读请求正文?

为什么我们必须在使用OpenResty/nginx lua执行子请求之前阅读请求正文?,nginx,lua,openresty,Nginx,Lua,Openresty,我们部分地将nginx访问控制委托给一个单独的服务,并使用access_by_lua_file和lua resty hawk以及subrequests对请求进行身份验证 他们说: 在启动子请求之前,您应该始终读取请求正文(通过调用ngx.req.read_body或配置lua_need_request_body on) 起初我们忽略了这个细节,事情似乎正在进行。我试图找到更多关于这个要求的背景信息,但结果是空的 在阅读正文之前授权请求会很好,因为如果客户端只是试图上传各种垃圾并填满我们的磁盘,我

我们部分地将nginx访问控制委托给一个单独的服务,并使用access_by_lua_file和lua resty hawk以及subrequests对请求进行身份验证

他们说:

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

起初我们忽略了这个细节,事情似乎正在进行。我试图找到更多关于这个要求的背景信息,但结果是空的

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


为什么会有这样的限制?

既然没有人回答这个问题,我想通过引用官方文件来澄清原因

always\u forward\u body
设置为true时,如果未指定
body
选项,则当前(父)请求的请求正文将始终转发到正在创建的子请求。创建子请求时,由ngx.req.read_body()或lua_need_request_body on读取的请求正文将直接转发到子请求,而无需复制整个请求正文数据(无论请求正文数据缓冲在内存缓冲区或临时文件中)。默认情况下,此选项为false,当未指定body选项时,仅当子请求采用PUT或POST请求方法时,才会转发当前(父)请求的请求正文

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

正如您所看到的,这不是强制性的,因此您的案例中的内容似乎是有效的。

用于未经全文阅读的预验证。还可以缓存身份验证响应,以防止来自已验证用户的冗余请求