asset()函数默认不走cdn,需配置asset_url=https://cdn.example.com;mix()则依赖mix_asset_url或webpack.mix.js设置;cdn域名不能含路径,资源须按原始结构上传至cdn根目录。

Asset 函数默认不走 CDN,必须手动改配置
asset() 函数本质只是拼接 URL:它把传入的路径加上 APP_URL 或 ASSET_URL 配置值前缀。默认情况下,它完全不知道 CDN 的存在——除非你明确告诉它用哪个域名。
常见错误现象:asset('css/app.css') 依然输出 http://yoursite.com/css/app.css,CDN 域名压根没出现。
- 修改
.env文件,设置ASSET_URL=https://cdn.example.com(注意末尾不要加斜杠) - 确保
APP_URL保持为你的主站地址(如https://yoursite.com),它不影响asset() - 运行
php artisan config:clear,否则缓存会掩盖配置变更
Laravel 9+ 的 mix() 和 asset() 行为不同
如果你用 Vite 或 Laravel Mix 打包资源,mix() 默认读取的是 MIX_ASSET_URL 环境变量,和 ASSET_URL 无关;而 asset() 只认 ASSET_URL。两者混用时容易漏配一个,导致部分资源走 CDN、部分仍走主站。
- Vite 场景:在
.env中设MIX_ASSET_URL=https://cdn.example.com,然后前端调用@vite(['resources/js/app.js'])才会生效 - Mix 场景:在
webpack.mix.js里显式调用.setPublicPath('https://cdn.example.com'),否则mix()生成的哈希路径仍基于本地路径 - 不建议同时依赖
asset()和mix()加载同一类资源(比如都加载 CSS),维护成本高且易出错
CDN 域名不能带路径,否则 asset() 拼接后 URL 错乱
这是最常踩的坑:ASSET_URL=https://cdn.example.com/assets 看似合理,但 asset('css/app.css') 会变成 https://cdn.example.com/assets/css/app.css——而你 CDN 实际可能只托管了 /css/app.css,结果 404。
-
ASSET_URL必须是纯域名或带协议的根域名,例如https://cdn.example.com或//cdn.example.com - 所有静态资源需按原始路径结构上传到 CDN 根目录下(即
css/、js/、images/直接放在 CDN 根路径) - 如果 CDN 必须用子路径(如
/static/),那就得改写asset()辅助函数,或用视图中硬编码https://cdn.example.com/static/{{ $path }}
HTTPS 和协议相对 URL 的兼容性要注意
有些 CDN 支持 //cdn.example.com 这种协议相对写法,但 Laravel 的 asset() 在生成 URL 时会强制补全协议——前提是 APP_URL 或 ASSET_URL 本身带协议。若你写成 ASSET_URL=//cdn.example.com,Laravel 会原样输出,浏览器按当前页面协议加载,看似省事,但混合内容(HTTP 页面加载 HTTPS 资源)或某些代理环境下可能失败。
- 生产环境强烈建议统一用
https://开头的ASSET_URL,避免协议协商不确定性 - 本地开发可保留
ASSET_URL=null,让asset()回退到APP_URL,避免本地起不来 - CDN 域名务必提前配置好 SSL 证书,否则现代浏览器会直接屏蔽不安全资源
CDN 配置真正麻烦的不是写几行代码,而是资源路径、缓存策略、SSL 证书、回源规则这几块要全部对齐——少对一环,就有一批资源加载失败,而且错误往往静默出现在用户侧,不好复现。










