Laravel 7 超过 2 层的路由出现 404 错误
Laravel 7 404 Error with Route with more than 2 Levels
我遇到了 Laravel 的有线问题,其中具有多个参数(均 mandatory/optional)的路由无法正常工作。
环境信息
- 本地:Windows、XAMPP、PHP 7.3
- 生产:Ubuntu 18.04,PHP 7.4
最初,我怀疑 .htaccess 文件有问题,但这似乎不是问题。
这在我的本地完美运行,但出于某种原因,它在 Ubuntu 服务器上不起作用。
以下代码完美运行。
Route::any('route/me/','Tst@routeme');
但是,以下任何一项都不起作用:
Route::any('route/me/here/','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/and/here','Tst@routeme');
有什么可以解决这个问题的建议吗?
我的第一个建议是将参数最多的路由放在顶部,例如:
Route::any('route/me/here/and/here','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/','Tst@routeme');
更像是先匹配的路由先执行,所以从上到下,参数最少的路由最后匹配。
第二件事我建议你将路线分组如下:
Route::prefix('route/me')->group(function () {
Route::get('here/and/here', 'Tst@routeme');
Route::get('here/{id?}', 'Tst@routeme');
Route::get('here', 'Tst@routeme');
});
为了更好的可读性...
我无法详细说明为什么会出现这种特殊情况,但是,匹配您的开发和生产环境应该可以在将来消除这些问题。
Homestead Docs
Laravel 团队提供的 Homestead vagrant box 是一个可靠的选择并且有据可查。它是一台 Ubuntu 18.04 / 20.04 机器,可以配置很多 add-ons。您可以使用 Homestead.yaml
文件中的一行轻松配置任何给定项目使用的 PHP 版本。
Docker Docs
Docker 稍微高级一点,但在配置方式上非常灵活。它的容器设计允许您隔离一个项目与下一个项目的依赖关系。
这些设置并不难(一两天内即可轻松完成),并允许您几乎完美地复制生产环境。
它将在那些“但它在我的机器上工作”的时刻提供巨大帮助!
更新我自己的问题,以便对其他人有所帮助。
我想说这可能是有人(或者至少是我)未能检查的最后一件事。我尝试列出我服务器中的路由,但发现找不到我新添加的路由。
php artisan route:list
早些时候,我清除了缓存,重新启动了 apache,但没有帮助。最终发现以下命令是当路由缓存且不起作用时的救命稻草。
所以对我有用的东西 - 清除“路由”缓存。
php artisan route:cache
php artisan route:clear
衷心感谢@Spholt、@Akbar khan、@Spholt、@Gzai Kun 的帮助。
我遇到了 Laravel 的有线问题,其中具有多个参数(均 mandatory/optional)的路由无法正常工作。
环境信息
- 本地:Windows、XAMPP、PHP 7.3
- 生产:Ubuntu 18.04,PHP 7.4
最初,我怀疑 .htaccess 文件有问题,但这似乎不是问题。 这在我的本地完美运行,但出于某种原因,它在 Ubuntu 服务器上不起作用。
以下代码完美运行。
Route::any('route/me/','Tst@routeme');
但是,以下任何一项都不起作用:
Route::any('route/me/here/','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/and/here','Tst@routeme');
有什么可以解决这个问题的建议吗?
我的第一个建议是将参数最多的路由放在顶部,例如:
Route::any('route/me/here/and/here','Tst@routeme');
Route::any('route/me/here/{id?}','Tst@routeme');
Route::any('route/me/here/','Tst@routeme');
更像是先匹配的路由先执行,所以从上到下,参数最少的路由最后匹配。
第二件事我建议你将路线分组如下:
Route::prefix('route/me')->group(function () {
Route::get('here/and/here', 'Tst@routeme');
Route::get('here/{id?}', 'Tst@routeme');
Route::get('here', 'Tst@routeme');
});
为了更好的可读性...
我无法详细说明为什么会出现这种特殊情况,但是,匹配您的开发和生产环境应该可以在将来消除这些问题。
Homestead Docs
Laravel 团队提供的 Homestead vagrant box 是一个可靠的选择并且有据可查。它是一台 Ubuntu 18.04 / 20.04 机器,可以配置很多 add-ons。您可以使用 Homestead.yaml
文件中的一行轻松配置任何给定项目使用的 PHP 版本。
Docker Docs
Docker 稍微高级一点,但在配置方式上非常灵活。它的容器设计允许您隔离一个项目与下一个项目的依赖关系。
这些设置并不难(一两天内即可轻松完成),并允许您几乎完美地复制生产环境。
它将在那些“但它在我的机器上工作”的时刻提供巨大帮助!
更新我自己的问题,以便对其他人有所帮助。
我想说这可能是有人(或者至少是我)未能检查的最后一件事。我尝试列出我服务器中的路由,但发现找不到我新添加的路由。
php artisan route:list
早些时候,我清除了缓存,重新启动了 apache,但没有帮助。最终发现以下命令是当路由缓存且不起作用时的救命稻草。 所以对我有用的东西 - 清除“路由”缓存。
php artisan route:cache
php artisan route:clear
衷心感谢@Spholt、@Akbar khan、@Spholt、@Gzai Kun 的帮助。