如何使用Nginx别名从其他目录加载PHP?
我想在我的web服务器上创建一个子目录,该系统从另一个文件夹为用户提供后端服务,但我遇到了一些困难 服务器配置应将系统转换为/srv/www/xxx/backend/web的index.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
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块。因此,它离开了位置并丢失了打印输出变量,使其成为无法找到的路径经过多次尝试和错误后,我终于能够使其工作感谢经过多次尝试和错误后,我终于能够使其工作