nginx如何使用预编译变量

nginx中有一些预编译参数,比如随便例举几个如下:

$server_addr        1.0.8        服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);

$server_name        1.0.8        请求到达的服务器名;

$server_port        1.0.8        请求到达的服务器端口号;

$server_protocol        1.0.8        请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

$uri        1.0.8        请求的URI,可能和最初的值有不同,比如经过重定向之类的。

对于这些参数,如果配置文件想用,那就非常简单,直接加上$使用即可,如: $server_addr

而如果在nginx内部二次开发的http模块想使用的话,使用如下三种函数:

直接引用变量有3个API可以调用:

ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r,
    ngx_uint_t index);
ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r,
    ngx_uint_t index);
ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r,
    ngx_str_t *name, ngx_uint_t key);

他们的区别是这样子的,ngx_http_get_indexed_variable和ngx_http_get_flushed_variable都是用来取得有索引的变量,不过他们的区别是后一个会处理 NGX_HTTP_VAR_NOCACHEABLE这个标记,也就是说如果你想要cache你的变量值,那么你的变量属性就不能设置NGX_HTTP_VAR_NOCACHEABLE,并且通过ngx_http_get_flushed_variable来获取变量值.而ngx_http_get_variable和上面的区别就是它能够得到没有索引的变量值.

通过上面我们知道可以通过索引来得到变量值,可是这个索引改如何取得呢,Nginx也提供了对应的接口:

ngx_int_t ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name);

通过这个接口,就可以取得对应变量名的索引值。

时间: 2024-10-06 03:23:44

nginx如何使用预编译变量的相关文章

个人对JavaScript预编译的理解

什么是js的预编译 马上要找工作了,之前学习JS都是很基础的皮毛,作为当前最火热的语言,本人一定是要研究的,然而刚接触到预编译我就快疯了,对于一个脑子不好使的人来说真的太绕了,饶了好久也不知道有没有绕明白,所以先记载下来,以后发现有啥不对的再纠正. 首先,JS解释器在执行一段script脚本时,首先会进行预编译,将代码中声明的变量和函数进行处理,然后才会按代码顺序翻译执行,那么JS在预编译和执行阶段分别进行了些什么操作呢?网上有很多大神的帖子给了说明: 1. 在执行代码前会进行类似"预编译&qu

js 变量预编译

js是按照顺序执行的: 但是在js中会对var和function进行预编译: alert(show); function show(){ var a; } 比如以上代码,alert就会输出function. 但是对于var的预编译,刚刚是自己理解错了, 如下代码,a输出都是undefined. b会直接报错,b is not defined. alert(a); alert(b); var a; 汇总下要点: 1.js在页面加载过程中顺序执行.但是分块预编译.执行. 2.JS 在执行前会进行类似

javascript中使用var定义变量的预编译效果

首先说明一点:javascript语法是非常灵活的,灵活的代价就是很容易导致不规范的编码和各种意想不到的运行结果.ECMAScript 5 引入了 严格模式 (strict mode),今后我们编写javascript代码最好都使用"use strict",规范我们的javascript代码.下面的测试代码不是基于严格模式. alert(a); var a;//已声明未赋值 alert(b);//未声明的变量 执行结果是:a打印undefined,b报错.这说明:var a;这条语句的

JavaScript 预编译(变量提升和函数提升的原理)

本文部分内容转自https://www.cnblogs.com/CBDoctor/p/3745246.html 1.变量提升 1 console.log(global); // undefined 2 var global = 'global'; 3 console.log(global); // global 4 5 function fn () { 6 console.log(a); // undefined 7 var a = 'aaa'; 8 console.log(a); // aaa

js 预编译环节的变量提升

有些东西需要先告诉你怎么用,再去理解定义 关于变量的提升 function test () { console.log(a) var a = 100 console.log(a) }; test () // undefined // 100 执行步骤 function test () { var a = undefined console.log(a) a = 100 console.log(a) } 关于函数的提升 function test () { console.log(a) funct

js预编译环节 变量声明提升 函数声明整体提升

预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a){ console.log(a) //function a(){} var a = 123; console.log(a)//123 function a(){} console.log(a)//123 var b = function(){} console.log(b) //function()

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe

JavaScript的预编译和执行

JavaScript引擎,不是逐条解释执行javascript代码,而是按照代码块一段段解释执行.所谓代码块就是使用<script>标签分隔的代码段. 整个代码块共有两个阶段,预编译阶段和执行阶段 一.编译阶段 对于常见编译型语言(例如:Java)来说,编译步骤分为:词法分析->语法分析->语义检查->代码优化和字节生成. 对于解释型语言(例如JavaScript)来说,通过词法分析和语法分析得到语法树后,就可以开始解释执行了. (1)词法分析是将字符流(char strea

【java web】java执行预编译Groovy脚本

在JVM中运行Groovy类有两种方式: 使用Groovy编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. 通过groovy类加载器在运行时直接加载*.groovy文件并生成对象.在这种方式下,没有生成任何*.class,但是生成了一个java.lang.Class对象的实例. 下面介绍前一种使用Groovy的方法:编译成java字节码并且作为正常java应用程序运行在java虚拟机上,即预编译模式. 1.