我有一个Laravel应用程序,我只想将其用于/api
路由。当访问/
,/login
,/profile
等时,我希望nginx提供位于基本根/var/www/html/index.html
中的索引文件。
这是我当前的default.conf
。 /api
路由有效,但它也从后端提供/
,这是我不想要的。
如果我只是将location /
更改为location /api
,那么/api
路由将变得不可访问,并且尝试访问它们将返回位于基本根/var/www/html/index.html
中的索引文件。这与我要实现的目标相反。哈哈。
如何保持/api
路由可访问性,同时又阻止后端/
提供服务?
server {
listen 80;
root /var/www/html;
server_name _;
index index.php index.html index.htm;
# API routes should be handled by the backend (Laravel).
##### I want to change the following line from "/" to "/api".
location / {
root /var/www/backend/public;
try_files $uri $uri/ /index.php?$query_string;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
}
}
答案 0 :(得分:0)
根据您的配置,这应该已经发生了。
指令:
try_files $uri $uri/ /index.php?$query_string;
将首先尝试查找静态文件,如果该静态文件存在并且不是php文件,则它将由nginx直接提供。仅当它是一个php文件时,才会与php后端一起提供。
如果要完全阻止执行.php
文件,可以进行修改以将/
位置与/api
位置分开:
location ~ ^/api/.*\.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
答案 1 :(得分:0)
我做到了这一点,但是有点不明智。 我有2个位置块:
location ~ "^(?!/api).*$"
匹配除 以/api
开头的所有路由。location /
与所有其他路线匹配。它不匹配 all 路由的原因仅仅是因为nginx首先匹配具有正则表达式的位置块。奇怪的是,在第二个块中使用正则表达式来匹配所有以<{1>}开头的 路径,这是行不通的。我还是不明白为什么。
/api