为什么$_SERVER[';SCRIPT_NAME';]返回';index.php';当我使用n


Why $_SERVER['SCRIPT_NAME'] return 'index.php' when I use nginx rewrite?

我使用的是YII框架,在Apache服务器上一切正常,但在Nginx上却出现了问题。当我请求URL www.test.com/index.php/a/b时,$_SERVER['SCRIPT_NAME']返回'/index.php',这正是我所需要的,但当我请求重写为同一个名为'index.php'的文件的URL www.testcom/a/b时,$_SERVER['SCRIPT_NAME']变成了'index.php’,这与Apache不同。我的nginx conf如下:

server {
    set $host_path "/data/yii/application";
    access_log  off;
    server_name www.yii.com;
    root   $host_path;
    set $yii_bootstrap "index.php";
    charset utf-8;
    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ $yii_bootstrap?$args;
    }
    location ~ ^/(protected|framework|themes/'w+/views) {
        deny  all;
    }
    #avoid processing of calls to unexisting static files by yii
    location ~ '.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ '.php {
        fastcgi_split_path_info  ^(.+'.php)(.*)$;
        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }
        fastcgi_pass   127.0.0.1:9001;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }
    location ~ /'.ht {
        deny  all;
    }
}

此部分错误:

set $yii_bootstrap "index.php";
location / {
    index  index.html $yii_bootstrap;
    try_files $uri $uri/ $yii_bootstrap?$args;
}

应该是:

location / {
    index  index.html index.php;
    try_files $uri $uri/ /index.php$uri?$args;
}

另请参阅:http://nginx.org/en/docs/faq/variables_in_config.html

--

这部分:

location ~ '.php {
    fastcgi_split_path_info  ^(.+'.php)(.*)$;
    #let yii catch the calls to unexising PHP files
    set $fsn /$yii_bootstrap;
    if (-f $document_root$fastcgi_script_name){
        set $fsn $fastcgi_script_name;
    }
    fastcgi_pass   127.0.0.1:9001;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
    #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
    fastcgi_param  PATH_INFO        $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
}

必须替换为:

location ~ ^(?<script>.+'.php)(?<pathinfo>.*)$ {
    try_files $script =404;
    fastcgi_pass   127.0.0.1:9001;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$script;
    #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
    fastcgi_param  PATH_INFO        $pathinfo;
    fastcgi_param  PATH_TRANSLATED  $document_root$script;
}

--

你应该避免这样的事情:

set $host_path "/data/yii/application";
root   $host_path;

必须是:

root /data/yii/application;

http://nginx.org/en/docs/faq/variables_in_config.html