2011年03月26日 JeremyWeiphp
PHP的$_SERVER數組中存在五個和路徑相關的變量:PHP_SELF
,SCRIPT_NAME
,
SCRIPT_FILENAME
,PATH_INFO
,REQUEST_URI
,這五個變量常常會被混淆,作下區分。html
Nginx0.8.54 + FastCGI + PHP5.3.4nginx
要先配置Nginx的PATH_INFO
,在nginx.conf
中加入以下配置:數組
location ~ .* .php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #從$fastcgi_script_name中分離出真正執行的腳本名稱和PATH_INFO set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } #從新設置SCRIPT_FILENAME fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; #從新設置SCRIPT_NAME fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; 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 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; }
咱們的根目錄爲/var/www
,測試域名爲example.com
(不過這個域名只能改hosts
文件YY一下了),結構以下:服務器
var |---www |---test |---test.php
使用以下腳本進行測試:測試
<?php echo 'SCRIPT_NAME=' . $_SERVER['SCRIPT_NAME'] . '<br />'; echo 'SCRIPT_FILENAME=' . $_SERVER['SCRIPT_FILENAME'] . '<br />'; echo 'PATH_INFO=' . $_SERVER['PATH_INFO'] . '<br />'; echo 'REQUEST_URI=' . $_SERVER['REQUEST_URI'] . '<br />'; ?>
PHP_SELF: 當前所執行的腳本的文件名,這個值是相對於根目錄來講。ui
若是請求http://example.com/test/test.php?k=v,則PHP_SELF
的值爲
/test/test.php。spa
SCRIPT_NAME: 當前執行的腳本的路徑。.net
若是請求http://example.com/test/test.php?k=v,則SCRIPT_NAME
的值
爲/test/test.php。這個變量是在CGI/1.1中定義的。code
SCRIPT_FILENAME: 當前執行的腳本的絕對路徑。
若是請求http://example.com/test/test.php?k=v,則SCRIPT_FILENAME
的值
爲/var/www/test/test.php。
注意:若是一個腳本以相對路徑,CLI方式來執行,例如../test/test.php,那麼
$_SERVER['SCRIPT_FILENAME']
的值爲相對路徑,即../test/test.php。
PATH_INFO:客戶端提供的路徑信息,即在實際執行腳本後面尾隨的內容,可是會去掉Query String。
若是請求http://example.com/test/test.php/a/b?k=v,則PATH_INFO
的值爲/a/b。
CGI1.1標準中以下描述:」The PATH_INFO string is the trailing part of thecomponent of the script URI that follows the SCRIPT_NAME part of the path.」
REQUEST_URI:包含HTTP協議中定義的URI內容。
若是請求http://example.com/test/test.php?k=v,則REQUEST_URI
爲/test/test.php?k=v
PHP_SELF VS SCRIPT_NAME:
PHP_SELF
和SCRIPT_NAME
的值在大部分狀況下都是同樣的,可是訪問
http://example.com/test/test.php/a/b?k=v這類URL時候,PHP_SELF
爲/test/test.php/a/b,SCRIPT_NAME
爲/test/test.php,能夠看出PHP_SELF
比SCRIPT_NAME
多了PATH_INFO
的內容。
REQUEST_URI VS SCRIPT_NAME:
在訪問http://example.com/test/test.php?k=v後,REQUEST_URI
爲/test/test.php?k=v,SCRIPT_NAME
爲/test/test.php,能夠看出REQUEST_URI
比SCRIPT_NAME
多了Query String。
若是http://example.com/test/test.php在服務器端作了rewrite:
rewrite /test/test.php /test/test2.php;
那麼REQUEST_URI
爲/test/test.php,SCRIPT_NAME
爲/test/test2.php。