如何使用Nginx别名从其他目录加载PHP?

如何使用Nginx别名从其他目录加载PHP?,nginx,Nginx,我想在我的web服务器上创建一个子目录,该系统从另一个文件夹为用户提供后端服务,但我遇到了一些困难 服务器配置应将系统转换为/srv/www/xxx/backend/web的index.php,本质上系统应别名为另一个目录的索引 我的配置如下: location /system { alias /srv/www/xxx/backend/web; rewrite ^(.*) /index.php?r=$1; return 200 $document_root$fastcgi

我想在我的web服务器上创建一个子目录,该系统从另一个文件夹为用户提供后端服务,但我遇到了一些困难

服务器配置应将系统转换为/srv/www/xxx/backend/web的index.php,本质上系统应别名为另一个目录的索引

我的配置如下:

location /system {
    alias /srv/www/xxx/backend/web;
    rewrite ^(.*) /index.php?r=$1;
    return 200 $document_root$fastcgi_script_name;
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;

        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

location / {
    rewrite /(.*) /index.php?r=$1;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    try_files $uri =404;

    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}
我已经尝试过多次迭代,包括使用root,但是即使我可以得到:

return 200 $document_root$fastcgi_script_name;
给我:

/srv/www/xxx/backend/web/index.php
我已经查看了这个文件,以确保当我取出wget给我的返回值404时它能正常工作。我肯定我错过了一些非常简单的东西


有人能帮我理解出了什么问题吗?

由于位置php是嵌套的,/index.php URI不是在这里解析的,而是在配置的最后一个块中解析的。由于nginx中的别名不适用于try_文件,因此您需要使用。因此,您可以通过以下方法解决此问题:

location /system {

    root /srv/www/xxx/backend/web;
    rewrite ^/system/(.*)$ /$1 break;
    try_files $uri /system/index.php?r=$uri;

    location ~ \.php$ {
        rewrite ^/system/(.*)$ /$1 break;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;

        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

location / {
    rewrite /(.*) /index.php?r=$1;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    try_files $uri =404;

    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

由于位置php是嵌套的,/index.php URI不会在这里解析,而是在配置的最后一个块中解析。由于nginx中的别名不适用于try_文件,因此您需要使用。因此,您可以通过以下方法解决此问题:

location /system {

    root /srv/www/xxx/backend/web;
    rewrite ^/system/(.*)$ /$1 break;
    try_files $uri /system/index.php?r=$uri;

    location ~ \.php$ {
        rewrite ^/system/(.*)$ /$1 break;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;

        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

location / {
    rewrite /(.*) /index.php?r=$1;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    try_files $uri =404;

    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

为了完成接受的答案,我添加了一些部分以使静态文件正常工作:

location ~ ^/system(.*) {
    root /srv/www/xxx/backend/web;
    rewrite ^/system/(.*)$ /$1 break;
    try_files $uri /system/index.php?r=$1&$args;

    location ~ \.php$ {
        rewrite ^/system/(.*)$ /$1 break;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ (.*\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|mp4|ogg|woff|ttf))$ {
        rewrite ^/system/(.*)$ /$1 break;
        try_files $uri =404;
    }
}

最后一个位置解决了静态文件问题,即无法从此位置加载文件。

为了完成接受的答案,我添加了一些部分以使静态文件正常工作:

location ~ ^/system(.*) {
    root /srv/www/xxx/backend/web;
    rewrite ^/system/(.*)$ /$1 break;
    try_files $uri /system/index.php?r=$1&$args;

    location ~ \.php$ {
        rewrite ^/system/(.*)$ /$1 break;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;
        # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ (.*\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|mp4|ogg|woff|ttf))$ {
        rewrite ^/system/(.*)$ /$1 break;
        try_files $uri =404;
    }
}

最后一个位置解决了静态文件问题,即无法从此位置加载文件。

@XavierLucas oops所以我这样做了,糟糕的复制哦,好的。错误日志中有什么?@XavierLucas nout,它只是启动了进程,就是这样。您可以尝试对进程进行调整,看看会发生什么:strace-f-p$pgrep-f nginx:master | egrep-i open | stat.@XavierLucas我相信我知道发生了什么,尽管打印出来了,但它并没有进入位置内的PHP块。因此,它会离开该位置并丢失打印输出变量,从而使其成为无法访问的路径found@XavierLucas哦,我是这么做的,糟透了。错误日志中有什么?@XavierLucas nout,它只是启动了进程,就是这样。您可以尝试对进程进行调整,看看会发生什么:strace-f-p$pgrep-f nginx:master | egrep-i open | stat.@XavierLucas我相信我知道发生了什么,尽管打印出来了,但它并没有进入位置内的PHP块。因此,它离开了位置并丢失了打印输出变量,使其成为无法找到的路径经过多次尝试和错误后,我终于能够使其工作感谢经过多次尝试和错误后,我终于能够使其工作