Nginx高级配置 | Nginx变量使用
文章目录
- 一、内置变量
- 二、自定义变量
免费个人运维知识库,欢迎您的订阅:literator_ray.flowus.cn
Nginx 变量可在配置文件中引用,用于功能判断(如访问控制、重定向)、日志记录等多种场景。变量主要分为两类:内置变量和自定义变量。
一、内置变量
内置变量由 Nginx 模块提供,通过这些变量可以获取大量与客户端访问相关的信息。完整变量列表请参考官方文档:http://nginx.org/en/docs/varindex.html
常用内置变量
•$remote_addr
存放客户端的公网 IP 地址。•$proxy_add_x_forwarded_for
此变量的值为:客户端请求头中的 X-Forwarded-For字段内容(如果有),后跟一个逗号 ,,再追加 $remote_addr(客户端的公网 IP)。如果请求头中没有 X-Forwarded-For字段,则此变量的值等于 $remote_addr。常用于在多级代理中传递原始客户端 IP。•$args
存放 URL 中的查询字符串(Query String)部分(即 ?之后的内容)。例如,对于 URL http://www.magedu.org/main/index.do?id=20190221&partner=search,$args的值为 id=20190221&partner=search。•$is_args
如果请求 URL 中包含查询字符串(即有 ?和参数),则此变量值为 ?;否则为空字符串 ""。常用于在拼接 URL 时决定是否需要添加 ?。•$document_root
存放根据当前请求匹配的 root或 alias指令设置的根目录路径。例如:/apps/nginx/html。•$document_uri
存放当前请求的 URI(不包含查询字符串和协议、主机)。例如,对于 URL http://www.magedu.org/main/index.do?id=20190221&partner=search,$document_uri的值为 /main/index.do。•$host
存放客户端请求头中的 Host 字段值,即请求的主机名。•$limit_rate
如果配置了 limit_rate指令限制响应速率,此变量会返回配置的值(如 10240);否则返回 0。•$remote_port
存放客户端发起请求时使用的源端口号。•$remote_user
存放通过 HTTP Basic Authentication(auth_basic模块)认证后的用户名。•$request_body_file
当 Nginx 将客户端请求体(request body)临时存储到文件以发送给后端服务器时,此变量存放该临时文件的路径名(主要在反向代理场景中使用)。•$request_method
存放客户端使用的请求方法,如 GET、POST、PUT、DELETE等。•$request_filename
存放当前请求所对应资源在服务器上的完整文件系统路径。该路径由 root或 alias指令与 $uri组合计算得出。例如:/apps/nginx/html/main/index.html。•$request_uri
存放客户端的原始请求 URI(包含查询字符串,不包含协议和主机)。其值等于 $document_uri?$args。例如:/main/index.do?id=20190221&partner=search。•$scheme
存放请求使用的协议方案,如 http、https、ftp等。•$server_protocol
存放客户端请求使用的协议版本,如 HTTP/1.0、HTTP/1.1、HTTP/2.0。•$server_addr
存放服务器接收请求的 IP 地址。•$server_name
存放匹配当前请求的 server块中的 server_name 指令值。•$server_port
存放服务器接收请求的端口号。•$http_user_agent
存放客户端请求头中的User-Agent字段值,包含客户端的浏览器详细信息。•$http_cookie
存放客户端请求头中的 Cookie 字段值,包含客户端发送的所有 Cookie 信息。•$cookie_<name>
存放请求头中名为 <name>的特定 Cookie 的值。<name>需替换为实际的 Cookie 名称。例如,$cookie_sessionid获取名为 sessionid的 Cookie 值。•$http_<header_name>
存放客户端请求头中名为 <header_name>的任意头部字段的值。<header_name>需转换为小写字母,并将短横线 -替换为下划线 _。例如:•$http_user_agent等同于 $http_user_agent(但推荐直接使用内置变量)。•$http_referer获取 Referer头信息。•$http_x_forwarded_for获取 X-Forwarded-For头信息。•$sent_http_<header_name>
存放服务器在响应中发送的名为 <header_name>的任意响应头部字段的值。<header_name>需转换为小写字母,并将短横线 -替换为下划线 _。例如:•$sent_http_content_type获取 Content-Type响应头信息。•$sent_http_cache_control获取 Cache-Control响应头信息。•$sent_http_server获取 Server响应头信息(注意:Nginx 自身版本信息通常由 $nginx_version获取更直接)。•$arg_<name>
存放 URL 查询字符串中名为 <name>的参数值。例如,对于 URL http://example.com/?id=123&name=foo:•$arg_id的值是 123。•$arg_name的值是 foo。
配置示例 (location /main):
location /main {index index.html;default_type text/html;echo "hello world,main->";echo $remote_addr; # 客户端公网IPecho $args; # 查询字符串echo $document_root; # 根目录echo $document_uri; # 不包含查询参数的URIecho $host; # 请求主机名echo $http_user_agent; # 用户代理echo $http_cookie; # 所有Cookieecho $request_filename; # 资源文件系统路径echo $scheme; # 协议echo "$scheme://$host$document_uri?$args"; # 完整请求URL
}
二、自定义变量
可以通过 set
指令自定义变量名称并赋值。
语法:
set $variable value;
-
Default: —
-
Context:
server
,location
,if
示例:
set $name lhl; # 定义变量 $name 并赋值 'magedu'
echo $name; # 输出: mageduset $my_port $server_port; # 将内置变量 $server_port 的值赋给自定义变量 $my_port
echo $my_port; # 输出服务器端口 (e.g., 80)echo "$server_name:$server_port"; # 输出服务器名和端口 (e.g., www.lhl.org:80)
请不要以此视为定论,这只是我的个人经验