Laravel含jobs的路由出现404问题求助
/b/{business}/jobs/create 404的问题 嘿,这种情况我之前开发Laravel项目时也碰到过,改成1212能正常访问,说明核心的控制器和路由逻辑是没问题的,问题大概率出在路由匹配优先级或者环境配置上,咱们一步步排查解决:
检查路由定义顺序
Laravel的路由是按照代码里的定义顺序进行匹配的,如果你的这条路由之前有类似Route::get('/b/{business}/{any}', 'SomeController@handle')这种模糊匹配的路由,Laravel会把jobs当成{any}的参数值,直接走那条模糊路由,导致你的/b/{business}/jobs/create永远匹配不到。
解决方法:把Route::get('/b/{business}/jobs/create', 'JobController@create')->name('dashboard_job_create');这条路由移到所有模糊匹配路由的前面,让它先被匹配到。清除路由缓存
如果之前你执行过php artisan route:cache生成了路由缓存,后续修改路由文件后,新的路由规则不会自动生效,依然会用缓存里的旧规则。
执行以下命令:php artisan route:clear然后运行
php artisan route:list,在输出列表里确认这条路由是否存在,并且路径正确。检查Web服务器重写规则
- 如果用的是Apache:确保项目根目录的
.htaccess文件是Laravel默认的配置,里面的重写规则要能正确把所有请求转发到index.php,避免服务器把jobs当成静态目录去查找:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> - 如果用的是Nginx:确认你的站点配置里的
try_files指令正确,要保证所有非静态文件的请求都转发到Laravel的入口文件:location / { try_files $uri $uri/ /index.php?$query_string; }
- 如果用的是Apache:确保项目根目录的
排除Route Model Binding的干扰
虽然你改成1212能访问,这个可能性不大,但可以快速测试:把路由里的{business}换成一个固定的、存在的业务ID,比如/b/1/jobs/create,如果能正常访问,说明模型绑定没问题;如果还是404,那可能是模型绑定的逻辑里有额外的限制(比如软删除、状态判断),可以检查Business模型的resolveRouteBinding方法或者全局范围。排查路由组/中间件的影响
看看这条路由是不是在某个路由组里?比如有没有加前缀、域名限制或者自定义中间件?可以暂时把这条路由移到路由组外面,直接放在web.php的最顶部测试,如果能访问,再逐步排查路由组里的配置是不是有冲突。
按照上面的步骤排查,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Robert Boerema

