PHP_SELF,SCRIPT_NAME,SCRIPT_FILENAME,PATH_INFO,REQUEST_URI的區別

PHP_SELF,SCRIPT_NAME,SCRIPT_FILENAME,PATH_INFO,REQUEST_URI的區別

2011年03月26日 JeremyWeiphp

前言

PHP$_SERVER數組中存在五個和路徑相關的變量:PHP_SELFSCRIPT_NAME, 
SCRIPT_FILENAMEPATH_INFOREQUEST_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.phpspa

  • 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_SELFSCRIPT_NAME的值在大部分狀況下都是同樣的,可是訪問 
    http://example.com/test/test.php/a/b?k=v這類URL時候,PHP_SELF 
    /test/test.php/a/bSCRIPT_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=vSCRIPT_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.phpSCRIPT_NAME/test/test2.php

相關文章
相關標籤/搜索