使用echo模块
- 编译时加载 echo module
--add-module=/$yourPath/echo-nginx-module- 在配置文件中增加一段
location /echomodule {
set $foo 'hello';
echo "foo: ${foo},world!";
}
- 验证
curl 'http://localhost/echomodule
- TIPS:
a. set的作用,包括创建一个变量,给该变量赋值,两个部分
变量的创建、赋值所处的生命周期以及作用域
- 假设有如下配置
location /foo0 {
echo ">>> ${foo1} <<<";
}
> 检测语法时,提示foo1是个未知变量
``` shell
nginx: [emerg] unknown "foo1" variable
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
- 再新增加一段配置,使用set创建变量foo1
location /foo0 {
echo ">>> ${foo1} <<<";
}
location /foo1 {
set $foo1 'foo 1';
echo ">>> ${foo1} <<<";
}
语法显示
syntax is ok
,但是curl foo0的时候,却总是返回空值,说明创建变量是在加载配置的时候发生的,而赋值变量是在每一次请求时候发生的,因此在curl foo0时,虽然在加载配置时,创建了变量foo1,但是赋值操作并没有进行
- 修改foo0的配置,给foo0赋值
location /foo0 {
set $foo0 $foo1;
echo ">>> ${foo0} <<<";
}
curl foo0的结果依然为空,更加验证了上述观点,即在配置加载的时候,创建了两个变量,foo0和foo1,当curl foo1的时候,foo1 被赋值为 u'foo 1',curl不为空;当curl foo0的时候,foo0 期望被赋值为foo1,然而foo1在
location /foo0
是没有被赋值过的,nginx将foo0赋值了一个空值,因此curl返回结果为空
- TIPS:
a. 在nginx中,变量的一次请求就是完整的生命周期,虽然curl foo1的时候foo1被赋值,但是当curl foo0时,由于两次生命周期是互相隔离的,因此在另一个生命周期中,
set $foo0 $foo1;
相当于将$foo0赋值为空串
再谈变量的生命周期与作用域
- 假设有如下配置
location /foo2 {
set $foo1 'you see foo 2';
rewrite ^ /foo3;
}
location /foo3 {
echo ">>> ${foo1} <<<";
}
curl foo2得到的结果为>>> you see foo 2 <<<
,而直接curl foo3得到的结果为空,可以看到变量的一个完整的生命周期是与location无关,并且,一次rewrite并不会影响变量的生命周期
内建变量
- nginx有一些buildin的变量,包括uri,request_uri,args等,以及通过arg_xxx的形式获取传入参数的值,假设有如下配置
location /buildin {
echo ">>> uri: $uri <<<";
echo ">>> request_uri: $request_uri <<<";
echo ">>> args: $args <<<";
echo ">>> x: $arg_x <<<";
echo ">>> y: $arg_y <<<";
}
执行
curl 'http://localhost/buildin?x=0&y=0'
,将得到
uri: /buildin
request_uri: /buildin?x=0&y=0
args: x=0&y=0
x: 0
y: 0
- 强制修改内建变量