我有一个问题,运行/folder从不同的途径,而不是主要的网站。
该部分的nginx.conf如下所示:
location ~ \.php$ {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
include fastcgi.conf;
}
location ~ /folder {
alias /srv/http/folder;
try_files $uri $uri/ @folder;
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include fastcgi.conf;
}
}
location @folder {
rewrite /folder/(.*)$ /folder/index.php?/$1 last;
}在error.log中,我可以看到以下内容:
2020/06/03 09:05:26 [error] 25966#25966: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.21.2.46, server: example.com, request: "GET /folder/xxx_v6.15.11/Resources/images/redcaplogo.gif HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "example.com"有什么办法解决这个问题吗?
发布于 2020-06-03 17:28:37
Regex位置从第一个匹配到最后,第一个找到的匹配由nginx处理。当您收到/folder/script.php请求时,它将由第一个location块处理。试着换掉这两个地点。另外,为什么在第二个位置块中不包括fastcgi_params?
更新
我做了一些调试,让我们看看您的代码(假设位置块已经被交换):
location ~ /folder {
alias /srv/http/folder;
try_files $uri $uri/ @folder;
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include fastcgi_params;
include fastcgi.conf;
}
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
include fastcgi.conf;
}
location @folder {
rewrite /folder/(.*)$ /folder/index.php?/$1 last;
}如果我们得到一个请求/folder/some/path (并且folder中没有some/path文件或目录),那么嵌套位置内部的nginx变量将有以下值:
$request_filename:空字符串(在folder目录中没有真正的文件或文件夹/some/path );$uri:/folder/check.php;$document_root:/srv/http/folder.如果我们得到一个请求/folder/some/path/script.php (并且有一个真正的具有此名称的PHP脚本),那么在嵌套位置内部的nginx变量中将有以下值:
$request_filename:/srv/http/folder/some/path/script.php;$uri:/folder/some/path/check.php;$document_root:/srv/http/folder.此外,当您从文件夹(例如/folder/some/path/static.css )获得静态资源请求时,try_files $uri ...指令将在/srv/http/folder目录中搜索folder/some/path/static.css文件,这将导致检查/srv/http/folder/folder/some/path/static.css文件的存在。
在folder目录中获取文件子路径的可能解决方案之一是:
location ~ ^/folder(?<subpath>.*) {
alias /srv/http/folder;
try_files $subpath $subpath/ @folder;
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$subpath;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include fastcgi_params;
include fastcgi.conf;
}
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
include fastcgi.conf;
}
location @folder {
rewrite ^/folder/(.*)$ /folder/index.php?/$1 last;
}如果您的实际folder目录名称与/folder URI前缀相同,则可以简化此操作:
location ~ ^/folder {
root /srv/http;
try_files $uri $uri/ @folder;
location ~ \.php$ {
fastcgi_param SCRIPT_FILENAME $document_root$uri;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include fastcgi_params;
include fastcgi.conf;
}
}
...作为nginx文档州
当位置与指令值的最后一部分匹配时: 位置/图像/{别名/数据/w3/图像/;} 最好使用根指令,而不是: 位置/图像/{ root /data/w3;}
https://stackoverflow.com/questions/62178581
复制相似问题