Laravel 5.5中public目录下CSS路径失效问题求助
嘿,这个问题我之前也碰到过,核心原因是对Laravel的asset()辅助函数的路径指向逻辑理解有误,咱们一步步来解决:
为什么会出现404?
Laravel的asset()函数默认是指向项目的public目录根路径的。当你写asset('public/xxx')时,生成的URL会变成http://127.0.0.1:8000/public/xxx,但实际上你的静态文件是放在public/global/...下的,相当于系统会去寻找public/public/global/...这个不存在的路径,自然就返回404了。
而当你去掉路径里的public后,asset('global/...')会正确指向public/global/...,所以文件能正常加载。
解决方案
1. 直接修正asset()的路径写法
这是最直接的解决方法,把路径里的public去掉就行:
<link rel="stylesheet" href="{{ asset('global/bower_components/bootstrap/dist/css/bootstrap.min.css') }}">
这样生成的URL就是http://127.0.0.1:8000/global/bower_components/bootstrap/dist/css/bootstrap.min.css,刚好对应你public目录下的真实文件路径。
2. 检查配置文件确保路径指向正确
如果你的项目配置有改动,也可以检查以下两处:
- 打开项目根目录的
.env文件,确认APP_URL设置正确,比如:APP_URL=http://127.0.0.1:8000 - 打开
config/app.php文件,查看asset_url配置项,如果它被错误设置成了包含public的路径,改成空或者正确的根路径即可:'asset_url' => env('ASSET_URL', null),
3. (可选)使用Laravel Mix管理静态资源
如果你的项目用到了Laravel Mix,推荐用mix()函数来引入资源,它会自动处理路径和版本缓存问题:
<link rel="stylesheet" href="{{ mix('global/bower_components/bootstrap/dist/css/bootstrap.min.css') }}">
不过前提是你已经通过Mix编译过对应的资源(如果需要的话)。
补充说明
当你用php artisan serve启动服务时,Laravel默认会把public目录作为Web服务器的根目录,这和你部署到Apache/Nginx时设置DocumentRoot为public目录是一样的逻辑,所以URL里不需要额外加public前缀。
内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara

