[nginx]lua控制响应头

Posted 花酒锄作田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[nginx]lua控制响应头相关的知识,希望对你有一定的参考价值。

nginx-lua笔记之控制响应头

前言

适用场景:添加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语言的配置、开发与架构详解》

nginx+lua怎样实现http请求的响应

在 ngx_lua 中访问 NginX 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容。

如何获取POST请求体数据?

要获得完整的POST请求体数据,可以访问 NginX 内置变量 ngx.var.request_body(注意:由于 NginX 默认在处理请求前不自动读取 request body,所以目前必须显式借助 form-input-nginx 模块才能从该变量得到请求体,否则该变量内容始终为空!)。如果想获取 POST 方式提交的表单参数,还可以借助 form-input-nginx 模块省去解析过程
参考技术A   在 ngx_lua 中访问 NginX 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容。

如何获取POST请求体数据?

要获得完整的POST请求体数据,可以访问 NginX 内置变量 ngx.var.request_body(注意:由于 NginX 默认在处理请求前不自动读取 request body,所以目前必须显式借助 form-input-nginx 模块才能从该变量得到请求体,否则该变量内容始终为空!)。如果想获取 POST 方式提交的表单参数,还可以借助 form-input-nginx 模块省去解析过程

以上是关于[nginx]lua控制响应头的主要内容,如果未能解决你的问题,请参考以下文章

如何定义一个nginx lua函数

nginx日志添加请求以及响应body

如何优雅打印nginx header和body

Openresty日志输出请求头 log lua

nginx+lua怎样实现http请求的响应

Lua 级别 CPU 火焰图介绍