首先,我已经在 SO 和其他地方进行了搜索,但看起来我就是无法让这个东西发挥作用。我正在“抓取”其他人解决的问题并尝试结合他们的解决方案,但我得到的只是一堆 404 和重定向循环。我不知道是否有任何尝试足够接近,可以作为几乎有效的尝试发布。
如果重要的话,这是一个 Slim 4 应用程序,但实际上它应该为多个“子应用程序”提供服务,基于每个应用程序将包含在各自目录中的特定配置。
项目根类似于
/var/www/project/instances
,在该目录中将有多个(生成的)子目录,每个子目录都有自己的 index.php
(以及一些其他文件)。这些子目录应该充当每个子应用程序的“根”目录:
/var/www/project/instances
|- /1/index.php
|- /2/index.php
|- /...
|- /N/index.php
应用程序将位于
app.project.test/1
、app.project.test/2
等位置。如果我只是对 root
进行硬编码,那么运行特定的“应用程序”就没有问题,但这应该是一个动态解决方案。
server
配置的基本布局如下:
server {
listen 80;
listen [::]:80;
server_name app.project.test;
root /var/www/project/instances;
absolute_redirect off;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
}
}
现在,有问题的部分是将 http 请求正确“路由”到这些子目录。是否应该根据 URL 中的第一段动态设置
root
? try_files
应该处理这个问题吗? fastcgi 参数也需要调整吗?
一路上想通了。
map $request_uri $instance_id {
~^/(?<first_uri_segment>[^/?]+) $first_uri_segment;
}
server {
listen 80;
listen [::]:80;
server_name app.project.test;
absolute_redirect off;
set $root_path /var/www/project/instances/$instance_id;
if (!-d $root_path) {
rewrite . http://projects.test redirect;
}
root $root_path;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
}
}