ngx_http_core模块提供的内置变量有很多,常见的有
$uri,用来获取当前请求的uri,不含请求参数。
$request_uri,用来获取请求最原始的uri,包含请求参数,且未解码。
$request,获取请求方法(GET或者POST)、$request_uri、HTTP协议版本。
$args,获取当前请求的参数串(即请求中问号后面的部分,如果有的话),未解码的原始值。$args变量是可以改变的,利用set指令即可 set $args a=1&b=2。需要注意的是,绝大部分的内置变量都不能改变,否则会发生意想不到的错误。
$arg_xxx(名字以arg_开头的所有的变量),用来获取请求参数的值。比如说$name,用来获取请求参数name的值,且是未解码的原始值。其实$arg_name不仅可以匹配name,还可以匹配NAME,甚至可以匹配Name,也就是说nginx匹配参数时是大小写不敏感的。
如果想对uri参数值中的%XX这样的编码序列进行解码,可以使用第三方ngx_set_misc模块提供的set_unescape_uri配置指令。
$cookie_xxx(名字以cookie_开头的所有的变量),用来获取cookie值。比如说$cookie_pasession,用来获取cookie中pasession的值,且是未解码的原始值。匹配同样是大小写不敏感
$http_xxx(名字以http_开头的所有的变量),用来获取请求头的值。比如说$http_user_agent,用来获取User-Agent请求头的值(如果请求头字符串中间有中横线,则变量中用下划线对应即可)。
$sent_http_xxx(名字以sent_http开头的所有变量),用来获取响应头的值。比如说$sent_http_connection,用来获取Connection响应头的值。$sent_http_content_type,用来获取Content-Type响应头的值(同请求头字符串的匹配一样,如果响应头字符串中间有中横线,变量中也是用下划线对应)
nginx某locatin块配置如下:
location /test {
echo $uri;
echo $request_uri;
echo $request;
echo $args;
echo $arg_name;
set_unescape_uri $decoded_name $arg_name;
echo $decoded_name;
echo $cookie_pasession;
echo $http_user_agent;
echo $sent_http_connection;
echo $sent_http_content_type;
}
这时如果在地址栏里输入的是xxx/test?name=张三&password=abc123,那么
$uri的值是/test,
$request_uri的值是/test?name=%E5%BC%A0%E4%B8%89&passsword=abc123,
$request的值是GET /test?name=%E5%BC%A0%E4%B8%89&passsword=abc123 HTTP1.1,
$args的值是name=%E5%BC%A0%E4%B8%89&passsword=abc123 HTTP1.1,
$arg_name的值是%E5%BC%A0%E4%B8%89
$decoded_name的值是张三
$cookie_pasession的值是qweasd123(用postman模拟的请求,并添加cookie,cookie key是pasession,cookie value是qweasd123)
$http_user_agent的值是Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36(浏览器不一样,具体值可能不一样)
$sent_http_connection的值是keep-alive
$sent_http_content_type的值是text/plain; charset=utf-8
内置变量还有很多很多,可以参考 https://www.cnblogs.com/luyucheng/p/6148242.html
原文地址:https://www.cnblogs.com/koushr/p/5873460.html