使用正则表达式来截取nginx中的内置变量

nginx 中的内置变量都可以通过if指令 + 正则表达式来进行截取,截取之后的结果通过正则表达式的分组来进行引用

比如:从请求中传过来的一个名为 ssl_client_s_dn 的变量,它的值是类似cn=username这样的

我们想要只留下username ,可以这样:

1
2
3
if ( $ssl_client_s_dn ~ (CN=([\S\s]*)) ){
set $username $2;
}

其中 $2 是指获取正则表达式匹配结果的第二个分组(也就是第二个括号中的内容)

再上一个例子,url是http://manhua.tawawa.top/test/a.jpg@!optimze,我们在保存图片缓存的时候,如果把proxy_cache_key的值设置为$request_uri的话,那么$request_uri的值是/test/a.jpg@!optimze,但是我们想要的是/test/a.jpg,这个时候就要对$request_uri进行截取。

1
2
3
4
5
6
7
location ~ ^/test/.* {
default_type text/html;
if ( $request_uri ~ ^(.*)@ ){
set $username $1;
}
return 502 $username;
}

在NGINX中进行调试的时候,有时候想要看一下变量的值,有两种方法。

1.通过标头发送nginx变量值:
add_header X-uri "$uri";
将在浏览器的响应标题中看到:
X-uri:/index.php

2.直接返回文本:

1
2
3
4
location / {
default_type text/plain;
return 502 "服务正在升级,请稍后再试……";
}

也可以使用html标签格式:

1
2
3
4
location / {
default_type text/html;
return 502 "服务正在升级,请稍后再试……";
}

也可以直接返回json文本:

1
2
3
4
location / {
default_type application/json;
return 502 '{"status":502,"msg":"服务正在升级,请稍后再试……"}';
}