2015-11-06 27 views
2

我们将nginx访问控制部分委托给一个单独的服务,我们使用access_by_lua_file和lua-resty-hawk和子请求来完成请求的身份验证。为什么我们必须在使用OpenResty/nginx lua进行子请求之前阅读请求体?

docs说:

你总是应该启动子请求之前读取请求体(由在任调用ngx.req.read_body或配置lua_need_request_body)。

本来我们已经错过了这个细节,事情出现工作。我试图找到关于这个要求的更多背景信息,但是却空了。

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

这是为什么限制?

+0

[auth_request](http://nginx.org/en/docs/http/ngx_http_auth_request_module.html)用于未经全身读取的预认证。身份验证响应也可以缓存以防止来自经过身份验证的用户的多余请求 – Anatoly

回答

0

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

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

简而言之,如果未指定选项主体,则可能会使用当前请求的主体,因此您需要先阅读请求主体。正如你所看到的,这不是强制性的,所以你的案例中的事情似乎有效。