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

时间:2015-11-06 20:19:13

标签: nginx lua openresty

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

docs说:

  

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

最初我们错过了这个细节,出现的事情正在发挥作用。我试图找到关于这个要求的更多背景信息,但是空洞了。

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

为什么会出现这种限制?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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