久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

博客專欄

EEPW首頁 > 博客 > openresty中filter_by_lua使用

openresty中filter_by_lua使用

發(fā)布人:天翼云開發(fā)者 時間:2025-11-07 來源:工程師 發(fā)布文章

本文分享自天翼云開發(fā)者社區(qū)《openresty中filter_by_lua使用》.作者:lucky_lyw

  1. body_filter_by_lua* 可能在一次請求中調(diào)用多次,跟響應(yīng)數(shù)據(jù)量無關(guān),取決于響應(yīng)次數(shù)

2. body_filter_by_lua* 多數(shù)時候離不開有 header_filter_by_lua* 輔助

-- access_by_lua_file:
ngx.say("123")ngx.say("456")-- body_filter_by_lua_file:local chunk, eof = ngx.arg[1], ngx.arg[2]print(chunk, eof)-- 結(jié)果
-- body_filter_by_lua*首次調(diào)用時:123 false-- body_filter_by_lua*第二次調(diào)用時:456 false-- body_filter_by_lua*第三次調(diào)用時: 空 true

當(dāng)代碼運行到 body_filter_by_lua* 時,HTTP報頭(header)已經(jīng)發(fā)送出去了。如果在之前設(shè)置了跟響應(yīng)體相關(guān)的報頭,而又在 body_filter_by_lua*中修改了響應(yīng)體,會導(dǎo)致響應(yīng)報頭和實際響應(yīng)的不一致。舉個簡單的例子:假設(shè)上游的服務(wù)器返回了 Content-Length 報頭,而 body_filter_by_lua* 又修改了響應(yīng)體的實際大小。客戶端收到這個報頭后,按其中的 Content-Length 去處理,順著一頭栽進(jìn)坑里。由于 Nginx 的流式響應(yīng),發(fā)出去的報頭就像潑出去的水,要想修改只能提前進(jìn)行。OpenResty 提供了跟 body_filter_by_lua* 相對應(yīng)的 header_filter_by_lua*。header_filter 會在 Nginx 發(fā)送報頭之前調(diào)用,所以可以在這里置空 Content-Length 報頭:

header_filter_by_lua_block {
    ngx.header.content_length = nil}


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。


關(guān)鍵詞: API網(wǎng)關(guān)

技術(shù)專區(qū)

關(guān)閉