Laravel - Nginx,基于路径的根目录
Laravel - Nginx, Root Directory Based on path
我有一种情况需要处理来自 https://example.com/api/v1
的所有请求
来自不同的文件夹比方说 /var/www/firstversion/public
和 https://example.com/api/v2
来自其他文件夹 /var/www/secondversion/public
下面是我当前配置的样子
server {
root /var/www/firstversion/public/;
index index.html index.php index.htm index.nginx-debian.html;
server_name example.com;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location /api/v2/ {
alias /var/www/secondversion/public/;
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
这里的问题是我总是从 /var/www/firstversion/public/
得到响应。但是,为了验证是否正在选择位置块,我尝试添加 return 302 https://google.com
并且它起作用了。所以位置模式是匹配的,但不知何故 alias/root
不工作。有人可以指出正确的方向还是我错过了什么?
您首先缺少的是最后一个 try_files
指令参数被视为一个新的 URI,从头开始重新评估。也就是说,在您的 location /api/v2/ { ... }
处理了像 /api/v2/some/route
这样的请求之后,并且您的本地文件系统上没有这样的 /var/www/secondversion/public/some/route
物理文件或目录,内部重写为 /index.php$is_args$args
发生。之后,重写的 URI 将由您的 location ~ \.php$ { ... }
PHP-FPM 处理程序处理,该处理程序从上层配置级别继承其根作为 /var/www/firstversion/public/
。
try_files
指令与 alias
一起使用时可以使用 side effects which I don't think to be fixed at least until the major nginx version gets changed since there are too many configurations exists adopted to those effects in some way. When you need to host some complex PHP-based system (e.g. WordPress) under some URI prefix, a workaround like shown here 指令,并声明嵌套的 PHP 处理程序。但是你的情况完全不同,实际上只是服务一些 API 你不需要这么复杂的方法。
你应该明白你根本不需要坚持 location ~ \.php$ { ... }
来通过 PHP-FPM 守护进程处理 PHP 文件,而且你不需要坚持使用某种预定义的 PHP 处理程序 snippets/fastcgi-php.conf
(我想这就像显示的 一样)。相反,如果所有请求都应使用第一个或第二个后端应用程序的 index.php
专门处理,您可以自由定义自定义 PHP 处理程序,如下所示:
map $uri $api_root {
~^/api/v2 /var/www/secondversion/public;
default /var/www/firstversion/public;
}
server {
...
location ^~ /api/ {
include fastcgi_params;
# redefine some FastCGI parameters
fastcgi_param DOCUMENT_ROOT $api_root;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME $api_root/index.php;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
我有一种情况需要处理来自 https://example.com/api/v1
的所有请求
来自不同的文件夹比方说 /var/www/firstversion/public
和 https://example.com/api/v2
来自其他文件夹 /var/www/secondversion/public
下面是我当前配置的样子
server {
root /var/www/firstversion/public/;
index index.html index.php index.htm index.nginx-debian.html;
server_name example.com;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location /api/v2/ {
alias /var/www/secondversion/public/;
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
这里的问题是我总是从 /var/www/firstversion/public/
得到响应。但是,为了验证是否正在选择位置块,我尝试添加 return 302 https://google.com
并且它起作用了。所以位置模式是匹配的,但不知何故 alias/root
不工作。有人可以指出正确的方向还是我错过了什么?
您首先缺少的是最后一个 try_files
指令参数被视为一个新的 URI,从头开始重新评估。也就是说,在您的 location /api/v2/ { ... }
处理了像 /api/v2/some/route
这样的请求之后,并且您的本地文件系统上没有这样的 /var/www/secondversion/public/some/route
物理文件或目录,内部重写为 /index.php$is_args$args
发生。之后,重写的 URI 将由您的 location ~ \.php$ { ... }
PHP-FPM 处理程序处理,该处理程序从上层配置级别继承其根作为 /var/www/firstversion/public/
。
try_files
指令与 alias
一起使用时可以使用 side effects which I don't think to be fixed at least until the major nginx version gets changed since there are too many configurations exists adopted to those effects in some way. When you need to host some complex PHP-based system (e.g. WordPress) under some URI prefix, a workaround like shown here 指令,并声明嵌套的 PHP 处理程序。但是你的情况完全不同,实际上只是服务一些 API 你不需要这么复杂的方法。
你应该明白你根本不需要坚持 location ~ \.php$ { ... }
来通过 PHP-FPM 守护进程处理 PHP 文件,而且你不需要坚持使用某种预定义的 PHP 处理程序 snippets/fastcgi-php.conf
(我想这就像显示的 index.php
专门处理,您可以自由定义自定义 PHP 处理程序,如下所示:
map $uri $api_root {
~^/api/v2 /var/www/secondversion/public;
default /var/www/firstversion/public;
}
server {
...
location ^~ /api/ {
include fastcgi_params;
# redefine some FastCGI parameters
fastcgi_param DOCUMENT_ROOT $api_root;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME $api_root/index.php;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}