nginx中不同client设置User-Agent与user_agent的坑

2023-05-16

最近发现nginx内部用lua获取user_agent,得到的是一个table值,很奇怪,自己测试记录一下:

1、nginx配置

location /zcy/hello {
    set_by_lua $ret '
        local headers = ngx.req.get_headers();
        
        ngx.log(ngx.ERR, "user_agent value: ", headers["user_agent"])
        ngx.log(ngx.ERR, "user-agent value: ", headers["user-agent"])

        if type(headers["user_agent"]) == "table" then
            local str = ""
            for k, v in pairs(headers["user_agent"]) do
                str = str .. k .. ":" .. v .. ","
            end
            ngx.log(ngx.ERR, "user_agent type table: ", str)
        else
            ngx.log(ngx.ERR, "user_agent value: ", headers["user_agent"])
        end
        return;
    ';

    set $ret_body '{"code": "200","msg": "zcy"}';
    return 200 $ret_body;
}

 

2、Python测试user_agent和User-Agent

首先说明一下,Python不能同时设置两个相同的header,例如两个user_agent

测试1

def test_agent_1():
    url = 'http://localhost:8888/zcy/hello'
    r = requests.get(url,
            headers={
                'host':'zcy-server',
                'user_agent':'zcy_agent (1)',
                'User-Agent':'zcy_agent (2)',
                })
    assert 200 == r.status_code

日志结果: 
    user_agent: zcy_agent (1)
    user-agent: zcy_agent (2)

分析:得到两个不同的值

测试2:

def test_agent_2():
    url = 'http://localhost:8888/zcy/hello'
    r = requests.get(url,
            headers={
                'host':'zcy-server',
                'user_agent':'zcy_agent (3)',
                'user_agent':'zcy_agent (4)',
                })
    assert 200 == r.status_code

日志结果: 
    user_agent: zcy_agent (4)
    user-agent: python-requests/2.21.0

分析:user-agent值为默认的python-requests

测试3:

def test_agent_3():
    url = 'http://localhost:8888/zcy/hello'
    r = requests.get(url,
            headers={
                'host':'zcy-server',
                'User-Agent':'zcy_agent (5)', 
                'User-Agent':'zcy_agent (6)',
                })
    assert 200 == r.status_code

日志结果: 
    user_agent: zcy_agent (5)
    user-agent: zcy_agent (5)

分析:user_agent和user-agent都有值,且是Python第一次设置的值zcy_agent (5)。且在Nginx内部user-agent的值会传给user_agent。

 

3、CURL测试user_agent和User-Agent

curl命令1:

curl "http://localhost:8888/zcy/hello" -H 'user_agent:zcy_agent (1)' -H 'User-Agent:zcy_agent (2)'

结果
user_agent value: zcy_agent (2)
user-agent value: zcy_agent (2)

分析:设置的User-Agent有效,curl内部可能将user_agent的值设置为user-agent的值 

curl命令2:

curl "http://localhost:8888/zcy/hello" -i -H "host:zcy-server" -H 'user_agent:zcy_agent (3)' -H 'user_agent:zcy_agent (4)'

结果
 user_agent value: curl/7.29.0
 user-agent value: curl/7.29.0

分析:设置user_agent无效

curl命令3:

curl "http://localhost:8888/zcy/hello" -H "User-Agent:zcy_agent (5)" -H "User-Agent:zcy_agent (6)"

结果
user_agent和user-agent都是table,lua报错

 

为什么会是table类型呢,因为是可以设置的,查看:https://github.com/openresty/lua-nginx-module#ngxreqget_headers

For multiple instances of request headers such as:

 Foo: foo
 Foo: bar
 Foo: baz

the value of ngx.req.get_headers()["Foo"] will be a Lua (array) table such as:

 {"foo", "bar", "baz"}

4、结论

1:设置http头要根据client的设置情况,Python不能设置重复的http头,而curl可以设置重复http头

2:当客户端同时设置user_agent和user-agent时,也是根据不同客户端情况进行分析,比如curl内部可能将user_agent的值设置为user-agent的值 。

3:curl可以设置重复的http头,这样导致nginx内部获取http头时解析出问题,因为lua类型是一个table。

请我喝咖啡

如果觉得文章写得不错,能对你有帮助,可以扫描我的微信二维码请我喝咖啡哦~~哈哈~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx中不同client设置User-Agent与user_agent的坑 的相关文章

随机推荐

  • window下使用vnc远程登录linux图形界面和运行应用程序 和odroid Xu4开发板的使用和视频接口VGA、DVI、HDMI的联系

    注 xff1a 自己曾经尝试过很多次使用VNC远程登录odroid XU4的开发板 xff0c 但是连接后均显示未解码的连接 xff0c 刚开始烧写的是odroid官方的ubuntu系统 xff0c 我靠 xff0c 就是因为烧写了这个坑爹
  • Putty的ppk文件转成Xshell使用的key文件

    Putty的ppk文件转成Xshell使用的key文件 今天同学给我一个Putty远程登录使用的ppk文件 xff08 即后缀名为ppk xff09 让我远程登录主机 xff0c 但是我用的是Xshell xff0c 导入这个ppk文件时
  • GD32串口读取GPS模块数据并解析经纬度教程-附完整代码和资料文件

    前言 xff1a 最近入手了个GPS模块 xff0c 手上只有GD32的开发板 网上有很多使用STM32库函数的GPS驱动程序 xff0c 但是基于GD32库函数读取GPS驱动的教程居然一篇都没有 所以为了学习GD32库的同学 xff0c
  • opencv 所有lib文件

    今天在vs上写一段代码 xff0c 编译后总是显示有无法解析的函数 xff0c 又不知道该函数在哪个lib文件中 xff0c 在百度上找了半天 xff0c 也没找到 已是就将所有lib库都添加到vs链接中 如下 xff1a opencv c
  • Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程1 线程 进程 多线程概述2 创建线程 xff08 重点 xff09 2 1 继承Thread类 xff08 Thread类也实现了Runnable接口 xff09 2 2 实现Runnable接口 xff08 无消息返
  • Java网络编程(两种聊天室:TCP和UDP)

    网络编程 您的导航 网络编程网络编程基础知识一 网络编程三要素IP地址端口协议 二 IP地址与InetAddress类IP地址分类InetAddress类三 端口 xff08 Port xff09 与 InetSocketAddressIn
  • 免费发布一个网站(保姆级图文教程)

    利用GitHub Pages发布一个网页 第一步 xff1a 注册一个github账户 访问官网 点这两个都可以注册 根据提示输入一些信息 xff0c 然后创建账户 xff1a 然后你会收到一封邮件 xff0c 输入验证码或是打开邮件的验证
  • 修改键盘映射、交换按键

    修改键盘映射 交换按键 导航 修改键盘映射 交换按键写在前面一 创建配置文件二 修改键盘映射三 重启四 键位表 写在前面 这两天买了个黑爵的小键盘 xff0c del和ins键是同一个键 xff0c 通过fn来区分 xff08 我的笔记本电
  • Spring Cloud Gateway(黑马springcloud笔记)

    Gateway 目录 Gateway一 为什么需要网关二 gateway入门三 断言工厂四 过滤器工厂五 全局过滤1 实现2 过滤器执行顺序 六 跨域问题 一 为什么需要网关 不能让外部能够直接访问微服务 xff0c 而是需要通过网关访问
  • Docker(黑马spring cloud笔记)

    Docker 目录 Docker一 介绍和安装1 安装2 启动3 镜像加速 二 Docker基本操作1 镜像操作2 容器操作3 数据卷操作 三 Dockerfile1 镜像结构2 Dockerfile 四 Docker Compose1 安
  • RabbitMQ(黑马spring cloud笔记)

    MQ 目录 MQ一 同步通讯和异步通讯1 同步通讯2 异步通讯 二 RabbitMQ1 部署2 架构3 常见消息模型3 1 基本消息队列 xff08 Basic Queue xff09 3 2 工作消息队列 xff08 Work Queue
  • Redis实战—黑马点评(一) 登录篇

    Redis实战 黑马点评 xff08 一 xff09 登录篇 来自黑马的redis课程的笔记 黑马程序员Redis入门到实战教程 xff0c 深度透析redis底层原理 43 redis分布式锁 43 企业解决方案 43 黑马点评实战项目
  • tigerVNC的简单使用教程(CentOS的远程桌面连接)

    tigerVNC的简单使用教程 xff08 CentOS的远程桌面连接 xff09 1 环境和软件准备 1 CentOS 6 3下 root 64 localhost rpm q tigervnc tigervnc server tiger
  • Redis实战—黑马点评(二)缓存篇

    Redis实战 黑马点评 xff08 二 xff09 缓存篇 目录 Redis实战 黑马点评 xff08 二 xff09 缓存篇1 什么是缓存1 1 缓存的作用和成本 2 添加 Redis 缓存3 缓存更新策略3 1 三种更新策略3 1 1
  • Reids实战—黑马点评(三)秒杀篇

    Reids实战 黑马点评 xff08 三 xff09 秒杀篇 来自黑马的redis课程的笔记 黑马程序员Redis入门到实战教程 xff0c 深度透析redis底层原理 43 redis分布式锁 43 企业解决方案 43 黑马点评实战项目
  • RT-Thread Stm32f103开启UART2(中断接收及轮询发送) 使用RT-Thread Studio

    RT Thread Stm32f103开启UART2 使用RT Thread Studio 1 使用RT Thread Studio新建RT Thread项目 2 修改dricer gt doard h 增加UART2的宏定义设置gpio接
  • 串口收发数据

    1 1 字符串接收函数 发送方结束标志是你接收方判断的依据 xff0c 也可以说是属于协议的一部分 我们这里使用串口助手数据发送自动添加了 r n xff0c 所以我们将它们看成结束标志 1 2 数据传输方式 计算机与外部进行沟通只有并行和
  • VsCode Studio的C/C++代码自动补全

    关于VsCode Studio的C C 43 43 代码自动补全 第一步 xff1a 需要下载VsCode中的C C 43 43 插件 如图 xff1a 插件下载后 xff0c 最好是重新启动一下VS 第二步 xff1a 找到设置 在输入框
  • Nginx lua设置Cookie,及学习Cookie

    网上看到这篇文章 xff0c 很喜欢这种分析思路 xff0c 这里学习记录一下 最近小了解了下cookie 以前觉得cookie无非就是一连串键值对 在深入了解之后发现 远没自己想的那么简单 自己果真太肤浅了 好吧 这里主要探讨一下以下几个
  • nginx中不同client设置User-Agent与user_agent的坑

    最近发现nginx内部用lua获取user agent xff0c 得到的是一个table值 xff0c 很奇怪 xff0c 自己测试记录一下 xff1a 1 nginx配置 location zcy hello set by lua re