Laravel 7使用asset()加载CSS背景图时URL重复public的问题排查
问题原因及解决方案
这个问题我之前踩过坑,核心是**asset()方法的默认逻辑和你配置的ASSET_URL发生了重复叠加**,导致URL里出现了两次public。
为什么会重复?
首先得明确asset()方法的默认行为:
- 在Laravel中,
asset()本来就是用来指向public目录下静态资源的方法,默认会自动拼接上public/前缀(对应你的域名就是http://localhost/LaraTest/public/),然后再加上你传入的资源路径(比如images/5copy.jpg),最终生成正确的URL。
而你现在的配置存在两个问题:
.env里的ASSET_URL设置成了http://localhost/LaraTest/public,而且等号后面还有个空格(这会导致Laravel读取配置时带多余空格,也是潜在问题)config/app.php里的asset_url也同步设置了带public的URL
这就导致asset()方法在处理时,把你配置的ASSET_URL(已经包含public)作为基础,又自动加上了原本就该由它处理的public/前缀,最终拼接出了http://localhost/LaraTest/public/public/images/5copy.jpg这种重复的URL。
解决步骤
1. 修正ASSET_URL配置
把.env里的ASSET_URL改成不带public的基础域名,并且去掉等号后面的空格:
ASSET_URL=http://localhost/LaraTest
同时把config/app.php里的默认值也同步修改:
'asset_url' => env('ASSET_URL', 'http://localhost/LaraTest'),
这样asset('images/5copy.jpg')就会自动帮你拼接成http://localhost/LaraTest/public/images/5copy.jpg,正好符合你的需求。
2. 清除配置缓存(关键!)
修改配置后,一定要运行以下命令清除Laravel的配置缓存,否则新配置不会生效:
php artisan config:clear
备选方案(适合特殊场景)
如果因为服务器配置限制,必须保留ASSET_URL带public,那你可以直接使用url()方法替代asset(),传入相对于public的路径:
background: url( '{{ url('images/5copy.jpg') }}') no-repeat;
不过更推荐第一种方案,符合Laravel的默认设计逻辑。
内容的提问来源于stack exchange,提问作者pc_fuel
相关产品推荐
相关产品推荐

