Laravel部署至Nginx服务器后无法访问存储目录中的图片
解决Laravel线上Nginx服务器图片无法访问的问题
看起来你遇到的问题很典型——本地跑的好好的,一部署到Nginx就掉链子😅。咱们一步步来排查:
1. 先确认软链接是否真的有效
你说执行php artisan storage:link提示目录已存在,但这时候要警惕:这个"public/storage"可能是个真实的目录,而不是软链接。
- 先删掉这个目录:
rm -rf public/storage - 然后重新创建软链接,建议用绝对路径创建(避免权限或路径解析问题):
php artisan storage:link --force # 或者手动创建绝对路径软链接,假设你的Laravel项目根目录是/var/www/laravel ln -s /var/www/laravel/storage/app/public /var/www/laravel/public/storage - 创建后,用
ls -l public/storage查看,输出应该类似这样(明确显示指向storage/app/public):lrwxrwxrwx 1 www-data www-data 32 Oct 10 12:00 public/storage -> /var/www/laravel/storage/app/public
2. 检查Nginx配置是否正确
Nginx的root必须指向Laravel项目的public目录,否则静态文件会找不到。打开你的Nginx站点配置文件(通常在/etc/nginx/sites-available/下),确认核心配置:
server { listen 80; server_name your_domain_or_ip; root /var/www/laravel/public; # 这里必须是public目录! index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } # 让Nginx直接处理静态文件,提高效率同时避免PHP解析问题 location ~* \.(jpg|jpeg|png|gif|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform"; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 根据你的PHP版本调整路径 } }
修改后重启Nginx:sudo systemctl restart nginx
3. 验证文件权限
线上服务器的文件权限是重灾区:
- 确保
storage目录和public/storage软链接的所有者是web服务器用户(通常是www-data):sudo chown -R www-data:www-data /var/www/laravel/storage sudo chown -R www-data:www-data /var/www/laravel/public/storage - 目录权限设为755,文件权限设为644:
find /var/www/laravel/storage -type d -exec chmod 755 {} \; find /var/www/laravel/storage -type f -exec chmod 644 {} \;
4. 优化图片URL生成(可选但推荐)
你现在用的url('/storage/images/'.$file->file_name)可以换成Laravel的asset()辅助函数,它会自动根据.env里的APP_URL生成正确路径,避免手动拼接的潜在问题:
<a href="{{ asset('storage/images/'.$file->file_name) }}" title="">View</a>
记得在.env里设置正确的APP_URL,比如APP_URL=http://your_ip_or_domain
做完这些步骤后,再试试访问图片,应该就能正常显示了。如果还是不行,打开浏览器开发者工具看一下网络请求的状态码(404、403之类的),能帮你更快定位问题~
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

