2015-11-06 28 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請求方法時,僅會轉發當前(父)請求的請求正文。

簡而言之,如果未指定選項主體,則可能會使用當前請求的主體,因此您需要先閱讀請求主體。正如你所看到的,這不是強制性的,所以你的案例中的事情似乎有效。