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',