前言
适用场景:添加CDN缓存时间、操作set-cookie、标记业务数据类型等。
获取响应头
- 指令:
ngx.resp.get_headers - 语法:
headers = ngx.resp.get_headers(max_headers?,raw?) - 环境:
set_by_lua*、rewrite_by_lua*、access_by_lua*、content_by_lua*、header_filter_by_lua*、body_filter_by_lua*、log_by_lua*、balancer_by_lua* - 含义:读取当前请求的响应头,并返回一个lua的table类型的数据
- 示例
server { # ... location /testlua { content_by_lua_block { local ngx = require "ngx"; local h = ngx.resp.get_headers() for k,v in pairs(h) do ngx.say(string.format("Header name: %s, value: %s",k,v)) end -- 从table中读取指定响应头的值 ngx.say(h["connection"]) } } }
请求测试:
curl -i http://192.168.0.10/testlua
修改响应头
- 指令:
ngx.header.HEADER - 语法:
ngx.header.HEADER = VALUE - 环境:
rewrite_by_lua*、access_by_lua*、content_by_lua*、header_filter_by_lua*、body_filter_by_lua*、log_by_lua*、balancer_by_lua* - 含义:对响应头进行修改、清除、添加等操作。(输出响应头时,默认会将“
_”替换为"-") - 示例
localtion /testlua { content_by_lua_block { local ngx = require "ngx"; ngx.header.myrespheader = "helloworld" ngx.header.content_type = 'test/plain' ngx.header.second_header = "hellonginx" -- 下划线会变成中划线 ngx.header["third_header"] = "hellolua" -- 等同于 ngx.header.third_header = "hellolua" ngx.header["forth_header"] = {"test10=10;env=10","test11=11;env=11"} -- 一个响应头里面设置两个值 local h = ngx.resp.get_headers() -- 读取响应头 for k,v in pairs(h) do ngx.say(string.format("Header name: %s, value: %s",k,v)) end } }
请求测试:
curl -i http://192.168.0.10/testlua HTTP/2 200 server: openresty date: Sun, 28 May 2023 02:39:26 GMT content-type: test/plain myrespheader: helloworld second-header: hellonginx third-header: hellolua Header name: second-header, value: hellonginx Header name: third-header, value: hellolua Header name: myrespheader, value: helloworld Header name: content-type, value: test/plain Header name: connection, value: close
删除响应头
如果要删除一个响应头,将其赋值为 nil 即可,例如:
ngx.header["second_header"] = nil
参考
- 《Nginx实战:基于lua语言的配置、开发与架构详解》