Nginx之所以灵活有一个原因就是支持变量并内置了许多常用变量,这些变量在配置文件中会经常被调用。在官方文档中有一个页面对内置变量有详细的介绍http://nginx.org/en/docs/http/ngx_http_core_module.html#variables。除了内置变量以外,每个模块也有自己的变量,这个在官网变量页面的Embedded Variables中有描述。
比如下面是Nginx日志格式的配置段,可以看到使用到了许多变量:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
Nginx常用变量释义
$args:用户请求时的所有URL参数
$arg_参数名:用户请求时URL中某个具体参数的值,非常有用
#下面代码默认请求路径是http://a,如果URL中参数at=5,则转发到http://b
location / {
if ($arg_at='5') {
proxy_pass http://b;
}
proxy_pass http://a;
}
$uri:用户请求的URI,不包括?后面的参数,使用$document_uri也是一样的效果
$request_uri:用户请求的完整URI,也就是浏览器地址栏/后面的所有内容
$remote_addr:客户端IP,现在更多使用ngx_http_realip_module来解决代理或者CDN导致IP不对的问题
$http_referer:客户端是否是从上一级页面跳转过来,如果是,那么记录上一级URL
$http_user_agent:客户端使用的浏览器
$http_x_forwarded_for:记录客户端真实IP而不是中间件的IP
$scheme:请求所用的协议,如HTTP或者HTTPS,可以使用该变量让用户跳转到https
if (schema = 'http') {
rewrite ^/(.*)$ https://$host/$1 redirect;
}
$request_method:请求方法,如GET或者POST
$document_root:当前请求所映射到的网站根路径
$remote_user:如果网站开启了用户认证,那么此值就是客户端输入的用户名
$host:http请求报文中host的首部,如果没有则以处理此请求的虚拟主机的主机名代替
$remote_port:客户端端口
$request_filename:用户请求中的URI经过本地转换后映射的本地文件路径
$server_addr:服务器地址
$server_name:服务器名称
$server_port:服务器端口
$server_protocol:服务器向客户端发送响应时的协议,如http/1.1
$http_HEADER:匹配请求报文中指定的HEADER
$http_host:匹配请求报文中的host首部