欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx配置文件中预定义全局变量的解说

程序员文章站 2022-03-22 23:40:58
...
-- nginx内置全局变量。

nginx内置了一些全局变量,本文挑选了几个最重要的进行描述。

$request
类似 GET /2.php?a=4 HTTP/1.1
包含了请求方法,url,协议。

$document_root
当前请求在 root 指令中指定的值,或alias指令的配置值

$args = $query_string
含义:查询字符串
样例参考值: a=b&c=d&e=f
说明: 相当于PHP中的服务器参数: $_SERVER[“QUERY_STRING”]
请求行中的参数字符串,$args是nginx的写法。

$is_args
含义:如果$args有值,则为?,否则为空字符串
所以,事实上这个变量大多是为了拼接url使用的。很有用的变量。

$request_uri
完整的原始请求行(带参数)。
包含请求参数的原始 URI, 不包含主机名, 如: ”/foo/bar.php?arg=baz”.

$uri = $document_uri
当前请求规范化以后的URI。
路径匹配在URI规范化以后进行。所谓规范化,就是先将URI中形如“%XX”的编码字符进行解码,
再解析URI中的相对路径“.”和“..”部分, 另外还可能会压缩相邻的两个或多个斜线成为一个斜线。
变量$uri的值可能随请求的处理过程而改变。 比如,当进行内部跳转时
例如:不带请求参数的当前 URI, $uri 不包含主机名, 如 "/foo/bar.html".

$request_filename
当前请求的文件路径, 由 root 或 alias 指令与 URI 请求生成.
含义:当前执行脚本的绝对路径,
例如:/var/www/project/1.php
但是,本文最后的例子表明,这不一定是个标准文件名
fastcgi会做进一步处理,生成script_filename

==================================================
$script_filename
这是fastcgi的参数,而不是nginx的变量。
含义:当前执行脚本的绝对路径,
例如:/var/www/project/1.php
相当于PHP中的服务器参数: $_SERVER[“SCRIPT_FILENAME”]

$path_info
这是fastcgi的参数,而不是nginx的变量。
含义:请求中真实脚本名称之后,查询语句(query string)之前的路径信息
例如当前 URL 为 http://www.example.com/php/user.php/some/stuff?foo=bar,
那么 PATH_INFO 将包含 /some/stuff。
说明: 相当于PHP中的服务器参数: $_REQUEST[“PATH_INFO”]

根据观察,path_info和script_filename 其实是fastcgi的参数,且fastcgi的参数会全部传递给php的$_SERVER变量。
但是fastcgi的参数,有些需要在nginx的配置文件中设置,才有值。

在nginx的配置目录下有个名为 fastcgi_params 的文件,里面内容如下:
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;


其实,fastcgi的所有参数都会在php的$_SERVER中有,当然有键不代表有值。
但键确实都有,
上面这个名为 fastcgi_params 的文件,最右边一列就是nginx 的内置全局变量 的一部分。
nginx 传给 fastcgi,fastcgi 传给 php 的 $_SERVER 变量。

==========================================================
实例:目录如下
/var/www/myapp_code1,这是root,
/var/www/myapp_code1/index.php
/var/www/myapp_code1/path/2.php
总共就两个文件,看看实例:
http://www.d1.com/path/2.php/aa/bb?a=4

(1)document_root=[/var/www/myapp_code1] 
(2)request_uri=[/path/2.php/aa/bb?a=4]                   
(3)uri=[/path/2.php/aa/bb] 
(4)request_filename=[/var/www/myapp_code1/path/2.php/aa/bb] 
(5)args=[a=4]

而php的 $_SERVER 变量
'SCRIPT_FILENAME' => '/var/www/myapp_code1/path/2.php',
'REQUEST_URI' => '/path/2.php/aa/bb?a=4',
'DOCUMENT_ROOT' => '/var/www/myapp_code1',
'DOCUMENT_URI' => '/path/2.php/aa/bb',
'QUERY_STRING' => 'a=4',