searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

openresty中filter_by_lua使用

2024-08-06 09:36:29
10
0
  1. body_filter_by_lua* 可能在一次请求中调用多次,跟响应数据量无关,取决于响应次数

2. body_filter_by_lua* 多数时候离不开有 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)

-- 结果
-- body_filter_by_lua*首次调用时:123 false
-- body_filter_by_lua*第二次调用时:456 false
-- body_filter_by_lua*第三次调用时: 空 true

当代码运行到 body_filter_by_lua* 时,HTTP报头(header)已经发送出去了。如果在之前设置了跟响应体相关的报头,而又在 body_filter_by_lua*中修改了响应体,会导致响应报头和实际响应的不一致。举个简单的例子:假设上游的服务器返回了 Content-Length 报头,而 body_filter_by_lua* 又修改了响应体的实际大小。客户端收到这个报头后,按其中的 Content-Length 去处理,顺着一头栽进坑里。由于 Nginx 的流式响应,发出去的报头就像泼出去的水,要想修改只能提前进行。OpenResty 提供了跟 body_filter_by_lua* 相对应的 header_filter_by_lua*header_filter 会在 Nginx 发送报头之前调用,所以可以在这里置空 Content-Length 报头:

header_filter_by_lua_block {
    ngx.header.content_length = nil
}
0条评论
0 / 1000
lucky_lyw
4文章数
0粉丝数
lucky_lyw
4 文章 | 0 粉丝
lucky_lyw
4文章数
0粉丝数
lucky_lyw
4 文章 | 0 粉丝
原创

openresty中filter_by_lua使用

2024-08-06 09:36:29
10
0
  1. body_filter_by_lua* 可能在一次请求中调用多次,跟响应数据量无关,取决于响应次数

2. body_filter_by_lua* 多数时候离不开有 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)

-- 结果
-- body_filter_by_lua*首次调用时:123 false
-- body_filter_by_lua*第二次调用时:456 false
-- body_filter_by_lua*第三次调用时: 空 true

当代码运行到 body_filter_by_lua* 时,HTTP报头(header)已经发送出去了。如果在之前设置了跟响应体相关的报头,而又在 body_filter_by_lua*中修改了响应体,会导致响应报头和实际响应的不一致。举个简单的例子:假设上游的服务器返回了 Content-Length 报头,而 body_filter_by_lua* 又修改了响应体的实际大小。客户端收到这个报头后,按其中的 Content-Length 去处理,顺着一头栽进坑里。由于 Nginx 的流式响应,发出去的报头就像泼出去的水,要想修改只能提前进行。OpenResty 提供了跟 body_filter_by_lua* 相对应的 header_filter_by_lua*header_filter 会在 Nginx 发送报头之前调用,所以可以在这里置空 Content-Length 报头:

header_filter_by_lua_block {
    ngx.header.content_length = nil
}
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0