当我使用nginx重写时,为什么$ _SERVER ['SCRIPT_NAME']返回'index.php'?

时间:2012-07-10 04:50:19

标签: php nginx yii

我正在使用YII Framework,在Apache服务器上一切正常,但在Nginx上却出错了。 当我请求URL www.test.com/index.php/a/b时,$ _SERVER ['SCRIPT_NAME']返回'/index.php'这正是我需要的,但当我请求URL www.test时。 com / a / b重写到名为'index.php'的同一文件,$ _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;
    }
}

1 个答案:

答案 0 :(得分:2)

这部分错了:

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