Laravel+Vue项目在Nginx下显示空白页问题求助
嘿,我来帮你排查这个问题!既然php artisan serve能正常跑,但Nginx下只有blade的文本能显示,Vue部分空白,大概率是静态资源加载或者Nginx配置的问题,咱们一步步来梳理:
这是最容易踩坑的点,Laravel需要Nginx正确把请求转发到index.php,同时要确保静态资源能被直接访问。你可以对照着调整你的Nginx配置文件:
server { listen 80; server_name your-domain.com; # 换成你的域名或localhost root /var/www/your-project/public; # 重点!必须指向Laravel项目的public目录 index index.php index.html; # 处理所有请求,把不存在的路径转发到index.php location / { try_files $uri $uri/ /index.php?$query_string; } # 解析PHP文件 location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # 换成你的PHP-FPM套接字路径 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } # 让Nginx直接处理静态资源,提升性能同时避免PHP解析 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } }
修改完配置后,记得重启Nginx生效:sudo systemctl restart nginx
如果你的项目用的是Laravel 9+默认的Vite构建工具:
- 先检查
vite.config.js里的base配置:如果项目部署在域名根目录,base: '/'就没问题;如果是子目录(比如example.com/laravel),要改成base: '/laravel/' - 别忘了运行
npm run build生成生产环境的静态资源——Nginx下不能用开发模式的热加载资源,必须用构建后的文件 - 检查
app.blade.php里的资源引入指令是否正确:@vite(['resources/js/app.js'])
如果是旧版用Webpack/Mix的项目:
- 运行
npm run prod构建资源 - 确保blade里用
mix('js/app.js')来引入资源,而不是硬编码的开发路径
如果Vue用了history模式(URL里没有#),Nginx必须配置try_files来处理路由跳转,否则直接访问子路由或者刷新页面会空白。前面Nginx配置里的location /块已经包含了try_files $uri $uri/ /index.php?$query_string;,这个配置会把所有不存在的路径转发到index.php,让Laravel或Vue路由来处理,刚好适配history模式。
打开浏览器开发者工具(F12),切换到Console和Network标签:
- 如果
Network里有404错误,说明静态资源路径不对,回头检查Nginx的root配置和资源引入路径 - 如果
Console里有JS报错,比如Vue实例初始化失败,那可能是构建后的JS文件有问题,重新运行npm run build试试
Laravel的storage和bootstrap/cache目录需要Nginx运行用户(通常是www-data)有读写权限,否则会影响缓存生成和资源加载:
sudo chown -R www-data:www-data /var/www/your-project/storage sudo chown -R www-data:www-data /var/www/your-project/bootstrap/cache sudo chmod -R 755 /var/www/your-project/storage sudo chmod -R 755 /var/www/your-project/bootstrap/cache
有时候缓存会搞出奇怪的问题,不妨清一波:
php artisan cache:clear php artisan config:clear php artisan route:clear
同时用Ctrl+Shift+R强制刷新浏览器,或者用隐私模式打开页面,排除浏览器缓存的影响。
内容的提问来源于stack exchange,提问作者Ruhith Udakara

