前言

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语言的配置、开发与架构详解》

[nginx]lua控制请求头的更多相关文章

  1. HTTP 请求头中的 X-Forwarded-For(转)

    原文:https://imququ.com/post/x-forwarded-for-header-in-http.html 我一直认为,对于从事 Web 前端开发的同学来说,HTTP 协议以及其他常 ...

  2. NGINX + LUA实现复杂的控制 --源自http://outofmemory.cn/code-snippet/14396/nginx-and-lua

    安装lua_nginx_module 模块 lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty Centos和debian的安装就简单了.. 这里说下freebs ...

  3. NGINX + LUA实现复杂的控制

    安装lua_nginx_module 模块 lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty Centos和debian的安装就简单了.. 这里说下freebs ...

  4. 安装nginx并配置nginxscript(njs)实现请求头验证或者分流

    本文以centos为例 nginx+nginxscript 源码安装nginx 安装必要环境 安装gcc环境 sudo yum -y install gcc gcc-c++ 安装 pcre,让ngin ...

  5. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  6. nginx log记录请求的头信息

    记录访问的log,为了在出现特殊情况时,方便检查出现问题的地方.log_format accesslog ‘$remote_addr – $remote_user [$time_local] “$re ...

  7. nginx代理 (带着请求头)

    当你获得云服务器之后, 你有这样一个需求:当你要访问一个url的时候,这个URL只能在人家的云服务器上访问(比如百度),所以你要买百度的BCC,你可能在想在BCC起服务,那样有点麻烦,直接使用ngin ...

  8. 解决通过Nginx转发的服务请求头header中含有下划线的key,其值取不到的问题

    1. 问题 由于在http请求头的头部中设置了一些自定义字段,刚好这些字段中含有下划线,比如bundle_name这种,后端在进去获取头部信息时,发现取不到对应的值 2. 原因及解决办法 分析 首先看 ...

  9. nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

  10. nginx 获取请求头,URL参数

    获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...

随机推荐

  1. 终端命令行前出现(base)

    原因 (base) 的出现是因为电脑安装了conda后,每次打开终端都会自动启动conda的base环境 解决 取消自动启动base环境:conda config --set auto_activat ...

  2. selenium 多浏览器处理

    开头 当我们做多浏览器自动化测试的时候,需要很多不同的浏览器,所以不同的参数对应不同的浏览器操作 目录结构 新建一个 base.py 文件, 通过 os 捕获到从命令行传进来的 import pyte ...

  3. pytest插件开发

    插件的加载方式 外部插件: pip install 安装的插件 本地插件: pytest 自动模块发现机制(conftest.py存放) 内置插件: 代码内部的_pytest目录加载 什么是hook ...

  4. 2020-09-06:Docker的命名空间有哪些?

    福哥答案2020-09-06: 福哥口诀法:命进I网挂U用 1.进程命名空间.CLONE_NEWPID.进程编号. 2.IPC 命名空间.CLONE_NEWPIPC.信号量.消息队列何共享内存. 3. ...

  5. 2021-07-07:股票问题4。给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成

    2021-07-07:股票问题4.给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你最多可以完成 ...

  6. json和字典dict的区别

    json和字典dict的区别? 银河有希子关注 2021.07.03 11:13:00字数 987阅读 173 作者:Gakki json和字典dict的区别? 字典写法:dict1 = {'Alic ...

  7. 树莓派上使用docker部署aria2,minidlna

    目前在树莓派上安装aria2跟minidlna能搜到的教程基本上都是直接apt-get install安装的.现在是docker的时代了,其实这2个东西可以直接使用docker run跑起来.有什么问 ...

  8. Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果

    Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果 准备香橙派一块!当前教程使用的是香橙派5 4G开发板 准备.NET环境 安装.NET Core依赖 sudo apt instal ...

  9. itextpdf5.5.13给pdf添加图片水印、添加文字水印(平铺)、添加文字水印(单个)、添加页眉、页脚、页眉事件、添加图片

    转载自简书用户:alex很累,感谢分享.原地址:https://www.jianshu.com/p/2b9c7a0300e4 一.相关工具类 1. Excel2Pdf.java (如代码不可用请查看原 ...

  10. go 实现ringbuffer以及ringbuffer使用场景介绍

    ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,虽然诸多版本,实现ringbuffer的核心逻辑却是不变的.但发现其 ...