Nginx和Laravel:如何将“位置”块限制为从“ /”到“ / api”?

时间:2019-06-15 19:30:23

标签: laravel nginx nginx-location

我有一个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;
        }

    }

}

2 个答案:

答案 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