前言

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. #Python实例 计算外卖配送距离(基于百度API接口)---第二篇

    https://www.cnblogs.com/simone331/p/17218019.html 在上一篇中,我们计算了两点的距离(链接为上篇文章),但是具体业务中,往往会存在一次性计算多组,上百甚 ...

  2. 2023-04-24:用go语言重写ffmpeg的muxing.c示例。

    2023-04-24:用go语言重写ffmpeg的muxing.c示例. 答案2022-04-24: 本程序的大体过程如下: 打开输出文件并写入头部信息. 添加音频和视频流,并为每个流创建 AVCod ...

  3. .NET周报 【5月第2期 2023-05-14】

    国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一 ...

  4. 记录内网Docker启动Stable-Diffusion遇到的几个坑

    摘要:最近看到K8s启动stable-diffusion的文章,想着在自己开发环境复现一下.没想到在内网环境还遇到这么多问题,记录一下. 本文分享自华为云社区<内网Docker启动Stable- ...

  5. GPT大语言模型Vicuna本地化部署实践(效果秒杀Alpaca)

    背景 上一篇文章<GPT大语言模型Alpaca-lora本地化部署实践>介绍了斯坦福大学的Alpaca-lora模型的本地化部署,并验证了实际的推理效果. 总体感觉其实并不是特别理想,原始 ...

  6. 「学习笔记」模运算与 BSGS 算法

    取模 取模符号:\(x \bmod y\),表示 \(x\) 除以 \(y\) 得到的余数. 例如, \[5 \bmod 3 = 2\\ 7 \bmod 4 = 3\\ 3 \bmod 3 = 0\\ ...

  7. 聊一聊 Python 安装中的 --enable-shared

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 今天在 CentOS 7.4 使用源码编译安装 Python-2.7.15 的时候,发现了一个 ...

  8. Atcoder-AGC033C

    看到这道题,是个博弈论,没见过树上的,于是想到在数列里的博弈论,又联想到树的特殊形式----链. 于是我们来讨论一下链的情况(对于没有硬币的点,我们就视为它被删掉了): 讨论链的情况 发现若是选择两端 ...

  9. C++面试八股文:用过STL吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第21面: 面试官:用过STL吗? 二师兄:(每天都用好吗..)用过一些. 面试官:你知道STL是什么? 二师兄:STL是指标准模板库(Standar ...

  10. OOP第三阶段题目集总结|课程总结-22201608-柯汶君

      第三阶段的题目集时间跨度大,内容比较充实,对前面学习过的类的继承,多态,接口进行了巩固练习,加深我们对多态的理解,学会更好地改善代码的结构.同时对最后阶段所学习的集合框架体系(Set.Map等)比 ...