Openresty 讀取請求體

2021-09-24 21:45:35 字數 1898 閱讀 8695

由於nginx預設不讀取請求體的資料,因此當lua通過ngx.var.request_body的方式獲取請求體時會發現資料為空,那麼,該如何獲得請求體的資料呢?

方式一:lua_need_request_body

語法:lua_need_request_body

預設值:off

環境:http、server、location、

含義:預設為off,即不讀取請求體。如果設定為on,則表示強制讀取請求體,此時,可以通過ngx.var.request_body來獲取請求體的資料。但需要注意一種情況,$request_body存在與記憶體中,如果它的位元組大小超過nginx配置的client_body_buffer_size的值,nginx就會把請求體存放到臨時檔案中。此時資料就不存在與記憶體中了,這會導致$request_body為空,所以需要設定client_body_buffer_size和client_max_body_size的值相同,避免出現這種情況。

這種配置方式不夠靈活,ngx_lua官網也不推薦使用此方法。

方式二:ngx.req.read_body

語法:ngx.req.read_body()

環境:rewrite_by_lua*、access_by_lua*、content_by_lua*

含義:同步讀取客戶端請求體,且不會阻塞nginx的事件迴圈。使用此指令後,就可以通過ngx.req.get_body_data來獲取請求體的資料了。按如果使用臨時檔案來存放請求體,就需要先使用函式ngx.req.get_body_file來獲取臨時檔名,再讀取臨時檔案中的請求體資料。

指令:ngx.req.get_body_data

語法:data = ngx.req.get_body_data()

環境:rewrite_by_lua*、access_by_lua*、content_by_lua*、log_by_lua*

含義:執行ngx.req.read_body指令後,可以使用本指令在記憶體中獲取請求體資料,結果會返回乙個lua的字串型別資料。如果要獲取lua的table型別的資料,則需要使用ngx.req.get_post_args

指令:ngx.req.get_post_data

語法:args,err=ngx.req.get_post_args(max_args?)

環境:rewrite_by_lua*、access_by_lua*、content_by_lua*、header_filter_by_lua*、body_filter_by_lua*、log_by_lua*

含義:在執行ngx.req.read_body指令後,可以使用本指令讀取包含當前請求在內的所有post值請求的查詢引數,返回乙個lua的table型別的資料。max_args引數的作用時限制引數的數量。為了服務的安全,最多支援使用100個引數(包括重複的引數),超過限制的引數會被忽略。如果max_args為0,則表示關閉此限制;但為了避免被無窮多的引數攻擊,不要將max_args設定為0,如果最多支援使用10個引數,則應配置為ngx.req.get_post_args(10)。

使用場景:

content_by_lua_block{

local ngx = require "ngx"

ngx.req.read_body()

local data = ngx.req.get_body_data()

if data then

ngx.print('ngx.req.get_body_data:',data,')

return

else

lcoal file = ngx.req.get_body_file()

if file then

ngx.say("body is in file",file)

else

ngx.say("no body found")

end

nginx請求體讀取(二)

2,丟棄請求體 乙個模組想要主動的丟棄客戶端發過的請求體,可以呼叫nginx核心提供的ngx http discard request body 介面,主動丟棄的原因可能有很多種,如模組的業務邏輯壓根不需要請求體 客戶端傳送了過大的請求體,另外為了相容http1.1協議的pipeline請求,模組有...

openresty獲取請求引數

ngx.var.arg xx與ngx.req.get uri args xx 兩者都是為了獲取請求uri中的引數,例如 strider 1 為了獲取輸入引數strider,以下兩種方法都可以 local strider ngx.var.arg strider local strider ngx.re...

請求行,請求頭,請求體

1.請求報文 請求行 請求頭 請求資料 空行 請求行求方法字段 url欄位和http協議版本 例如 get index.html http 1.1 get方法將資料拼接在url後面,傳遞引數受限 請求方法 get post head put delete options trace connect ...