一、如何通过openresty操作http头

http头分请求头和,响应头

在nginx的access_by_lua阶段操作请求头,操作请求头涉及两个函数。

1、ngx.req.get_headers,第一个参数请求头个数,默认分析100个头,防止恶意攻击,第二个参数默认将头域信息转为小写,如果设置为true会关闭掉。

2、ngx.req.set_headers对头的域信息作一些设置操作,并且可以设置为table

respnse header通常在header filter阶段操作响应头,可以通过ngx.header.*方法读取响应头信息,也可以重写头信息。

二、测试

2.1测试get_headers

1.conf/lua/request_header.json

local function print_table(t)local function parse_array(key, tab)local str = ''for _, v in pairs(tab) dostr = str .. key .. ' ' .. v .. '\r\n'endreturn strendlocal str = ''for k, v in pairs(t) doif type(v) == "table" thenstr = str .. parse_array(k, v)elsestr = str .. k .. ' ' .. v .. '\r\n'endendreturn str
endlocal headers = ngx.req.get_headers()
ngx.say(print_table(headers))
curl -H "Foo:bar"  http://localhost:8080/request_header

2.修改request_header.json

local headers = ngx.req.get_headers(1)

nginx -s reload热加载后,请求request_header响应只有打印了一个header

3.修改request_header.json

local headers = ngx.req.get_headers(0, true)

nginx -s reload热加载后,请求request_header响应header大小写保持不变

2.2测试set_headers

增加conf/lua/sub_request_header.json文件

cp conf/lua/request_header.json conf/lua/sub_request_header.json

修改conf/lua/request_header.json文件

local function print_table(t)local function parse_array(key, tab)local str = ''for _, v in pairs(tab) dostr = str .. key .. ' ' .. v .. '\r\n'endreturn strendlocal str = ''for k, v in pairs(t) doif type(v) == "table" thenstr = str .. parse_array(k, v)elsestr = str .. k .. ' ' .. v .. '\r\n'endendreturn str
end--local headers = ngx.req.get_headers(0, true)
--ngx.say(print_table(headers))
ngx.req.set_header('Foo', 'Bar')
local res = ngx.location.capture('/sub_request_header.json')
if res.status == ngx.HTTP_OK thenngx.say(res.body)
elsengx.exit(res.status)
end

子请求set_header

2.3测试response.header.*

2.3.1

ngx.header.Foo = 'Bar'--lua_transform_underscores_in_response_headersngx.header['Foo_Bar'] = 'Bar2'
curl -I http://localhost:8080/response_header

lua_transform_underscores_in_response_headers指令设置在nginx.conf,可以保持response.header中大小写保持不变

2.3.2修改response_header.json

2.3.3修改response_header.json,如果修改ContentType后边为table,只取出最后一个值

--ngx.header['Content_Type'] = {"a=32; path", "text"}
ngx.header['content_type'] = {"a=32; path", "text"}

2.3.4测试response.header的类型为table

修改response_header.json

ngx.say(type(ngx.header))

2.3.5打印response.header内容使用parirs方式,打印内容为空

local function print_table(t)local function parse_array(key, tab)local str = ''for _, v in pairs(tab) dostr = str .. key .. ' ' .. v .. '\r\n'endreturn strendlocal str = ''for k, v in pairs(t) doif type(v) == "table" thenstr = str .. parse_array(k, v)elsestr = str .. k .. ' ' .. v .. '\r\n'endendreturn str
endngx.say(print_table(ngx.header))

2.3.6打印response.header

local function print_table(t)local function parse_array(key, tab)local str = ''for _, v in pairs(tab) dostr = str .. key .. ' ' .. v .. '\r\n'endreturn strendlocal str = ''for k, v in pairs(t) doif type(v) == "table" thenstr = str .. parse_array(k, v)elsestr = str .. k .. ' ' .. v .. '\r\n'endendreturn str
endngx.header.Foo = 'Bar'
local resp = ngx.resp.get_headers(0, true)
ngx.say(print_table(resp))

(1)上面演示可以看到,通过ngx.header.*方式设置头信息。需要注意像ngx.set_headers,ngx.print,ngx.c这样函数后面,不能通过ngx.header去设置改变头信息。原因是这些函数调用后,触发一个内容句柄返回,内容句柄返回后,通头信息的设置会失效。如果在这些函数后面,调用ngx.header改变头信息,会得到lua异常。

(2)ngx.header就是一个普通的lua table

(3)通过ngx.header.Foo访问Foo这个域,内部会映射到index,并且跳转一个c函数,再去做这样的访问

(4)ngx.header.Foo='Bar'这样方式改变一个域信息,内部会映射到del index,来完成域信息改变,不要尝试使用pairs和ipairs方式去遍历ngx.header,而是通过ngx.resp.get_header()去获取所头部信息返回,这个函数获取的信息也并非是完全的

三、总结

请求头(ngx.req.get_headers/ngx.req.set_headers)和响应头(ngx.header/ngx.resp.get_headers)的操作和读取

通过lua操作http请求头相关推荐

  1. Python爬虫——2.底层操作和请求头、请求代理以及cookie操作

    本文章此节主要讲解: ·爬虫程序urllib2模块底层操作: ·请求头的设置和添加: ·请求代理的种类和类型: ·关于cookie的操作(手动添加/程序自动获取) 一.爬虫底层操作和请求头的设置 1. ...

  2. Selenium修改HTTP请求头三种方式

    什么是HTTP请求头 HTTP请求头是HTTP 协议的重要组成部分.它们定义了 HTTP 消息(请求或响应)并允许客户端和服务器与消息交换可选的元数据.它们由不区分大小写的头字段名称后跟一个冒号,然后 ...

  3. JavaScript 能否修改 Referer 请求头

    正如题目,本文主题也很直白,主要就是围绕这个问题展开.JavaScript 能否修改 Referer 请求头?现在 JavaScript 的能力越来越强大,JavaScript 似乎无所不能,修改一个 ...

  4. vue中axios设置表单头_VUE项目axios请求头更改Content-Type操作

    我就废话不多说了,大家还是直接看代码吧~ const httpServer = (opts, data) => { const token = localStorage.getItem('tok ...

  5. axios 登录后设置header,vue+axios 全局添加请求头和参数操作

    vue+axios 全局添加请求头和参数操作 走登录的接口都会返回一个 token 值, 然后存起来方便之后调接口的时候给后台传过去, 传给后台的方式有两种:(具体使用哪种需要和后台商量) 1, 放在 ...

  6. 判断request请求头中的referer实现的防盗链操作

    通俗的来讲,跨站访问资源,被称为盗链.比如某一个商业网站,有很多自主版权的图片,自身展示用于商业目的.而另一个没有版权的网站,希望在自己的网站上面也展示这些图片,直接使用超链接到有版权的网站,这样以来 ...

  7. Http 请求头中的 Proxy-Connection

    平时用 Chrome 开发者工具抓包时,经常会见到 Proxy-Connection 这个请求头.之前一直没去了解什么情况下会产生它,也没去了解它有什么含义.最近看完<HTTP 权威指南> ...

  8. chrome 请求带上cookie_【编号0002】请求头的内容,及其相关知识铺垫

    更新时间,来一篇关于请求头的内容介绍 首先,什么是请求头?这里指的是HTTP 1 版本中的请求信息的头部内容,注意,不含主体 0. 背景说明 客户端:你的浏览器 服务器:指的是网站服务器 请求:客户端 ...

  9. iOS安全之二次封装AFN并设置请求头/执行HTTPS加强安全

    以前都是直接复制粘贴二次封装好的代码 , 现在都忘了怎么写 . 恰好当前项目要用到请求头 , 在网上学习了一下 , 统一敲了一遍 .自从到了现在公司 , 才发现要学的东西太多了 , 当然 , 有个好的 ...

最新文章

  1. JEECG支付宝服务窗开发培训视频
  2. python项目实例代码-python开源项目及示例代码
  3. ssh登录虚拟机上的linux
  4. rpm卸载mysql和php_CentOS 6.5 卸载mysql和php
  5. Interview:人工智能岗位面试—人工智能职位之计算机视觉算法工程师的简介、知识结构、发展方向之详细攻略
  6. 深入分析几种PHP获取客户端IP的情况
  7. 呆萌直播源码:如何开发视频直播平台?
  8. 多项式相关操作学习笔记
  9. 内存泄露检测工具比较
  10. mysql8如何迁移_mysql8.0.11数据目录迁移的实现
  11. 小学计算机小蘑菇教案,森林里的小蘑菇教案.doc
  12. php操作elasticsearch
  13. 由于域安全组嵌套导致SPS访问控制群组和用户配置文件搜索失败
  14. 单机类似节奏大师游戏源码项目
  15. 超好用的代码格式化工具Astyle使用
  16. 比较热门好用的开源中文分词软件系统有哪些?
  17. java 键盘钩子程序
  18. 【原版教材•中英对照】密度泛函理论的化学家指南(第二版)— 传统量子力学的化学家们将从这篇得到特别的启发
  19. pytorch 机器翻译 seq2seq 模型和注意力机制
  20. redis之可视化工具

热门文章

  1. ActiveReports 9实战教程(2): 准备数据源(设计时、运行时)
  2. hibernate 之HQL查询实例
  3. 二、yii的入口与app应用实例(Yii::app())
  4. Linux 命令(41)—— tr 命令
  5. MySQL出现:ERROR 3 (HY000): Error writing file '/tmp/MYbEd05t' (Errcode: 28)
  6. C++ 函数重载、隐藏与覆盖的区别
  7. Java面试题:final修饰的对象,有几种初始化方式
  8. leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
  9. WinForm高级控件实例--职员信息登记
  10. 从Iris数据集开始---机器学习入门