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;
}
我目前正在尝试在一个网站的子目录中安装一个 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;
}