带有php fpm配置的nginx子位置失败
我的服务器有一个nginx配置,如下所示带有php fpm配置的nginx子位置失败,php,nginx,Php,Nginx,我的服务器有一个nginx配置,如下所示 当我请求服务/dev/sync/sync 它将路由到/home/work/app-web/src/api/dev/sync.php/sync 将php规则与$fastcgi\u script\u nameis/dev/sync.php和$fastcgi\u path\u infoissync 此规则只需要~/service/([a-zA-Z]*/[a-zA-Z]*)(/[a-zA-Z]*)$ 但是当我请求/service/dev/sync/sync时,它
服务/dev/sync/sync
/home/work/app-web/src/api/dev/sync.php/sync
$fastcgi\u script\u name
is/dev/sync.php
和$fastcgi\u path\u info
issync
~/service/([a-zA-Z]*/[a-zA-Z]*)(/[a-zA-Z]*)$
李>
但是当我请求/service/dev/sync/sync
时,它将返回404,并返回错误
*173 open()“/home/work/nginx/html/dev/sync.php/sync”失败(2:没有这样的文件或目录),客户端:172.18.17.90,服务器:localhost,请求:“POST/service/dev/sync/sync HTTP/1.1”
/home/work/nginx/html
是我的nginx服务器的默认根目录根目录下的配置不可用
完全可以工作。
这个配置有什么问题
server {
set $work_dir /home/work/app-web;
listen 80;
server_name localhost;
location ~ /service/([a-zA-Z]*/[a-zA-Z]*)(/[a-zA-Z]*)$ {
root $work_dir/src/api;
set $file $1;
set $action $2;
try_files $uri $uri/ /$file.php$action$is_args$query_string;
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)/(.*)$;
fastcgi_pass unix:/home/work/app-web/php/var/run/app-web.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $work_dir/src/api$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param UNIQUE_ID $request_id;
include fastcgi_params;
}
}
}
根配置工作正常。
您的问题是存在到/dev/sync.php/sync?的内部重定向,并且新的内部url与regexp位置不匹配
您可以使用激活调试
error_log /var/log/nginx/debug.log debug;
日志如下所示:
*1 trying to use file: "/dev/sync.php/sync" "/home/work/app-web/src/api/dev/sync.php/sync"
*1 internal redirect: "/dev/sync.php/sync?"
*1 rewrite phase: 1
*1 http script value: "/home/work/app-web"
*1 http script set $work_dir
*1 test location: ~ "/service/([a-zA-Z]*/[a-zA-Z]*)(/[a-zA-Z]*)$"
*1 using configuration ""
新URL是/dev/sync.php/sync?,此URL不匹配任何位置,因为regexp/service/([a-zA-Z]/[a-zA-Z])(/[a-zA-Z]*)$不用于内部URL
我建议您使用另一种配置:
server {
set $work_dir /home/work/app-web;
listen 80;
server_name localhost;
location ~ /service/([a-zA-Z]*/[a-zA-Z]*)(/[a-zA-Z]*)$ {
root $work_dir/src/api/;
set $file $1;
set $action $2;
rewrite .* /src/api/$file.php$action last;
}
location ~ \.php {
internal;
root $work_dir;
fastcgi_split_path_info ^(.+\.php)/(.*)$;
fastcgi_pass unix:/home/work/app-web/php/var/run/app-web.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param UNIQUE_ID $request_id;
include fastcgi_params;
}
error_log /var/log/nginx/test-error.log debug;
}
注意
内部
directive您可以使用directiveerror\u log/var/log/nginx/error.log debug激活日志代码>实际上,我已经用与提供者相同的方法修复了这个问题,但我不知道为什么子位置不匹配。当try\u files
时,匹配规则再次开始处理。是,当try\u files执行时,匹配规则再次开始处理