[nginx]lua控制请求头

简介: [nginx]lua控制请求头

前言

nginx原生提供expiresadd_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语言的配置、开发与架构详解》
相关文章
|
6月前
|
存储 缓存 Java
Openresty(lua+nginx)-Guava-Redis做多级缓存
Openresty(lua+nginx)-Guava-Redis做多级缓存
66 1
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
135 0
|
3月前
|
应用服务中间件 nginx
[nginx]lua读取请求体
[nginx]lua读取请求体
|
3月前
|
缓存 应用服务中间件 nginx
[nginx]lua控制响应头
[nginx]lua控制响应头
|
消息中间件 NoSQL 关系型数据库
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
170 0
|
6月前
|
NoSQL 关系型数据库 应用服务中间件
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
167 0
分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
|
缓存 NoSQL 应用服务中间件
基于Nginx+Lua优化多级缓存架构
基于Nginx+Lua优化多级缓存架构
158 0
|
负载均衡 应用服务中间件 测试技术
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(上)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
429 0
|
缓存 算法 前端开发
网站流量日志埋点收集—后端脚本(nginx+lua)|学习笔记
快速学习网站流量日志埋点收集—后端脚本(nginx+lua)
576 0
网站流量日志埋点收集—后端脚本(nginx+lua)|学习笔记