前言
nginx原生提供expires
、add_header
两个指令控制请求头,在Lua API中也有类似的指令。
添加请求头
- 指令:
ngx.req.set_header
- 语法:
ngx.req.set_header(header_name, header_value)
- 环境:
set_by_lua*
、rewrite_by_lua*
、access_by_lua*
、content_by_lua*
、header_filter_by_lua*
、body_filter_by_lua*
- 含义:添加或修改当前HTTP的请求头。如果请求头已经存在,则会被替换成新的值。通过此方式设置的请求头会被继承到子请求中。
- 示例
-- 设置一个名为Test_Ngx_Ver、值为 1.21.4 的请求头 ngx.req.set_header("Test_Ngx_Ver", "1.21.4") -- 同一个请求头设置多个值,用数组的方式添加 ngx.req.set_header("Test", {"1","2"})
清除请求头
- 指令:
ngx.req.clear_header
- 语法:
ngx.req.clear_header(header_name)
- 环境:
set_by_lua*
、rewrite_by_lua*
、access_by_lua*
、content_by_lua*
、header_filter_by_lua*
、body_filter_by_lua*
- 含义:清除当前请求中指定的请求头。清除后,如果存在未执行的子请求,则子请求会继承清除后的请求头
- 示例
ngx.req.clear_header("Test_Ngx_Ver")
获取请求头
- 指令:
ngx.req.get_headers
- 语法:
headers = ngx.req.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*
- 含义:获取当前请求的全部请求头,并返回一个Lua的Table类型的数据
- 示例
server { listen 8000; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location ~ ^/([a-z]+)/test { default_type 'text/plain'; content_by_lua_block { local ngx = require "ngx"; local h = ngx.req.get_headers() for k,v in pairs(h) do ngx.say('Header name: ',k,' value: ',v) end } # 指定header # ngx.say(h["host"]) } }
综合示例
location = /testlua { access_by_lua_block { ngx.req.set_header("version",'1.0') } content_by_lua_block { local h = ngx.req.get_headers() for k,v in pairs(h) do ngx.say(string.format("header name: %s, value: %s",k,v)) end ngx.say(h["host"]) } }
使用curl测试
curl -i http://192.168.0.10/testlua HTTP/1.0 200 server: openresty date: Thu, 25 May 2023 16:25:43 GMT content-type: application/octet-stream strict-transport-security: max-age=31536000; includeSubDomains; preload x-frame-options: DENY x-xss-protection: 1; mode=block x-content-type-options: nosniff header name: user-agent, value: curl/7.81.0 header name: accept, value: */* header name: host, value: rainux.cn header name: version, value: 1.0 192.168.0.10
参考
- 《Nginx实战: 基于Lua语言的配置、开发与架构详解》