nginx 变量机制(二)--脚本引擎

nginx 变量机制--脚本引擎_ngx_http_script_variables_count-CSDN博客

    之前写了一篇有关nginx变量机制的文章,后来发现前一篇文章大部分都是代码的逻辑,理解起来不够通透,最近又抽时间将代码重新梳理了一番,画了几个图帮助理解。希望对正在学习nginx源码的童鞋有一定的帮助,有任何疑问可随时沟通!

变量分类

    首先介绍一下nginx变量的分类,在nginx内部有大概三种类型的变量:

        1.前缀变量,保存在cmcf->prefix_variables数组中,例如,http_xx(获取请求header) sent_http_xx(获取响应header)等;

        2.内置变量,在所有ngx_http_module_t类型的模块中,调用preconfiguration函数添加的变量,保存在cmcf->variables_keys数组中;

        3.set类型的自定义变量,在conf文件中通过set指令设置的变量,最后保存到cmcf->variables数组中(对于值域为内置变量也需要在该数组中保存一下----后续会解释到)

ngx变量类型

自定义变量值域

    对于set  $name  $host$uri来说,值域是$host$uri。值域目前分为两种情况:

        1.简单的将值域设置为一个固定的字符串

        2.将值域设置为变量+字符串

        简单值域:将固定字符串最终保存到rlcf->codes下

        复杂值域:将变量及固定字符串都保存到rlcf->codes下(用法马上会有说明)

自定义变量的值域

变量求值

    在调用rewrite模块的回调函数时,会检查rlcf->codes数组下是否有内容,如果有值,就会进行变量求值的动作。

    对于简单变量,直接将固定字符串拷贝到r->variables数组中,供后续使用即可。

    对于复杂变量,首先遍历codes函数数组:

        1.通过自定义变量值域中的回调函数优先计算复杂变量所需要的长度信息,计算完成后,申请内存。

        2.通过设置的回调函数将变量的值域保存到申请的内存中(由于值域中的变量是内置变量,所以会直接调用内置变量的回调函数获取真实的value,如:$host的回调函数 --- 解释一中的疑问)

        3.将最后的结果保存到r->variables数组中,供后续使用即可

变量的生成

变量使用

        由于每个请求都会存在一个Request结构体,顾每个请求下的variables数组都是单独的,在Rewrite阶段已经将该数组填充完成,后续使用的时候,直接从该数组中获取值即可!

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx 转发请求头,包括 `User-Agent` 等其他 HTTP 请求头信息,是一个基本功能,并不需要额外配置即可实现。当你通过 nginx 接收到客户端的 HTTP 请求时,它会将请求的所有头部信息(包括 `User-Agent`、`Referer`、`Cookie` 等等)封装在一个请求上下文中。 ### 如何获取并转发 User-Agent 到目标服务器? 假设你已经设置了一个 Nginx 服务器作为反向代理,你需要转发用户浏览器的 `User-Agent` 到后面的 web 应用服务器上。这通常在配置文件的 `location` 或者 `server` 指令块里完成,可以利用 Nginx 的内置变量来达到目的。 #### 实现步骤: 1. **打开配置文件**:找到你的 Nginx 配置文件,通常是 `/etc/nginx/nginx.conf`, `/usr/local/nginx/conf/nginx.conf`, 或者特定的 site-specific 文件如 `/etc/nginx/sites-available/default`. 2. **定位到正确的配置部分**:找到处理你需要转发 `User-Agent` 的特定 `location` 或 `server` 块。 3. **添加或修改配置行**:在相应的块内,使用以下形式的配置行来保留并转发 `User-Agent` 到后端服务器: ```nginx location /path-to-your-resource { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header User-Agent $http_user_agent; } ``` 这里,`proxy_set_header User-Agent $http_user_agent;` 就是关键的一行。它告诉 Nginx 把从客户端接收到的原始 `User-Agent` 字段复制给后端服务器。 4. **重启 Nginx**:完成配置修改后,记得重启 Nginx 来应用新的设置: ``` sudo systemctl restart nginx ``` 或者对于其他 Linux 发行版,可能需要使用不同的命令重启 Nginx。 5. **测试和验证**:通过发送带有 `User-Agent` 的请求到你的 Nginx 服务器,然后检查后端服务器接收到的请求头部信息是否包含了你期望的 `User-Agent` 值。 ### 相关问题: 1. **如何查看 Nginx 的配置文件结构?** 2. **自定义 Nginx 脚本中如何处理多条 `proxy_set_header` 指令?** 3. **遇到 `proxy_set_header` 未起作用的情况应该排查哪些错误?** 以上步骤和相关问题提供了一套完整的指南,帮助理解 Nginx 如何处理和转发 `User-Agent` 等请求头部信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值