Laravel 在子目录中使用 NGINX 保留路由

Laravel in a sub-directory using NGINX with preserved routing

我目前正在尝试在一个网站的子目录中安装一个 Laravel 应用程序,使用 nginx 将所有流量引导至该应用程序。

我已经按照以下 Whosebug 问题中的建议进行操作,并且效果很好 Config nginx for Laravel In a subfolder

但是,当使用此方法时,它不需要将子目录放在 Laravel 应用程序路由中。

一个例子。

假设我使用以下 nginx 条目将对 https://example.com/shop 的所有请求指向 /shop 子目录...

location /shop {
    alias /var/www/shop/public;
    try_files $uri $uri/ @shop;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

location @shop {
    rewrite /shop/(.*)$ /shop/index.php last;
}

如前所述,这可行,但应用程序中商店“主页”的路径实际上是

Route::get('/', ShopController::class)->name('shop.home');

而我需要它

Route::get('/shop', ShopController::class)->name('shop.home');

我无法控制所有路由等,因为它在包中,还有其他各种原因为什么这对我来说更可取。

有没有办法修改上面的nginx入口来实现这个?我已经尝试了很多东西,但似乎无法让它工作。

提前致谢。

您需要动态设置并更改 fastcgi_param REQUEST_URI $request_url.

基本上是从 REQUEST_URI

中删除或添加(取决于您的需要)单词 /shop

您可能需要从 fastcgi_params 文件中删除 REQUEST_URI

更多信息和示例可以在

中找到

https://serverfault.com/questions/697569/rewrite-url-with-fastcgi-in-nginx

我没有测试过,所以可能需要在某些行中进行一些更改或更改事物的顺序...

但你可以尝试使用类似

的东西
location /shop {
    alias /var/www/shop/public;
    try_files $uri $uri/ @shop;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param REQUEST_URI /shop$request_uri;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

location @shop {
    rewrite /shop/(.*)$ /shop/index.php last;
}

多亏了 @shushu304

的线索,我才开始工作

我刚刚使用以下内容更新了 REQUEST_URI。

location /shop {
    alias /var/www/shop/public;
    try_files $uri $uri/ @shop;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param REQUEST_URI /shop$request_uri; <--------
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

location @shop {
    rewrite /shop/(.*)$ /shop/index.php last;
}