Laravel 5.7集成Admin LTE后生产环境无法加载vendor包中CSS/JS静态资源求助
Laravel 5.7集成Admin LTE后生产环境无法加载vendor包中CSS/JS静态资源求助
兄弟,生产环境碰到这种静态资源加载失败的问题确实闹心,尤其是已经排除了服务器环境(同服务器其他副本正常)的情况,咱们从SSL安装后的变化和当前站点的专属配置入手排查,一步步来:
1. 先排查「混合内容」问题(最可能的原因)
你提到是安装SSL后才出现的问题,这大概率是浏览器的混合内容安全策略在搞事情:页面是HTTPS协议,但Admin LTE生成的静态资源链接还是HTTP的,浏览器会直接阻止加载这些不安全的资源。
- 打开浏览器控制台(F12),切换到「Console」标签,看看是不是有「Mixed Content」相关的报错;
- 解决方法:
- 打开项目根目录的
.env文件,把APP_URL改成HTTPS格式:APP_URL=https://你的域名.com; - 清除Laravel配置缓存:
php artisan config:clear、php artisan cache:clear; - 检查模板里引用静态资源的方式,别用硬编码的HTTP链接,改用Laravel的
asset()助手函数,比如asset('vendor/adminlte/css/AdminLTE.min.css'),它会自动根据APP_URL的协议生成正确的链接。
- 打开项目根目录的
2. 确认网站根目录与Laravel Public目录的映射
你的目录结构是home/user/public_html和home/user/myapp,正常Laravel的入口应该是myapp/public,如果服务器修复或SSL配置后,网站根目录的指向变了,就会导致静态资源路径错误:
- 登录服务器,检查
public_html是不是myapp/public的软链接:执行ls -l /home/user/public_html,如果输出里没有指向myapp/public的信息,说明软链失效了; - 重新创建软链(先备份
public_html里的原有内容):ln -s /home/user/myapp/public /home/user/public_html; - 额外检查服务器配置(Nginx/Apache):比如Nginx的站点配置里
root是不是/home/user/myapp/public,Apache的DocumentRoot有没有指向这个路径。
3. 细化权限检查(别只停留在755/644)
你已经设置了目录755、文件644,但还要确认web服务器运行用户对资源目录有读取权限:
- 先搞清楚你的web服务器用的是哪个用户(Nginx一般是
www-data,Apache可能是apache或www); - 给
vendor目录和public/vendor目录设置正确的权限:chown -R www-data:www-data /home/user/myapp/vendor(替换成你的服务器用户); - 如果你之前通过
php artisan vendor:publish把Admin LTE的资源发布到了public/vendor,可以重新发布一次(生产环境先备份public/vendor):php artisan vendor:publish --provider="JeroenNoten\LaravelAdminLte\ServiceProvider"。
4. 清除各类缓存
缓存有时候会坑死人,尤其是环境变化后:
- 清除Laravel视图缓存:
php artisan view:clear; - 强制刷新浏览器缓存(Ctrl+Shift+R),避免浏览器加载旧的缓存资源;
- 如果你的网站用了CDN,记得手动清除CDN的缓存。
5. 检查SSL站点的重写规则
如果是Nginx,检查你的SSL站点配置里有没有正确处理静态资源的规则,比如:
location ~* \.(css|js|png|jpg|jpeg|gif|ico)$ { expires 1y; add_header Cache-Control "public, immutable"; try_files $uri $uri/ =404; } location / { try_files $uri $uri/ /index.php?$query_string; }
如果是Apache,检查myapp/public/.htaccess文件是否存在,内容是否正确,尤其是强制HTTPS的规则会不会干扰静态资源的请求。
最后一招:查日志找线索
如果以上都没用,临时开启Laravel的调试模式(APP_DEBUG=true,用完立刻改回false!),看看有没有具体的报错;或者查看服务器的错误日志(比如Nginx的/var/log/nginx/error.log,Apache的/var/log/apache2/error.log),日志里会记录找不到文件的具体路径,帮你精准定位问题。
备注:内容来源于stack exchange,提问作者Hemant Kumar




