Laravel生产环境下Storage目录图片无法访问问题求助
Laravel生产环境图片存储软链接无法访问问题排查与解决
1. 验证软链接指向正确性
首先确认public/storage软链接是否正确指向storage/app/public:
- 在项目根目录执行:
ls -l public/storage - 正确输出应为:
public/storage -> ../storage/app/public - 如果指向错误或链接不存在:
- 删除旧链接:
rm public/storage - 以web服务器运行用户(如
www-data)身份重新创建链接:sudo -u www-data php artisan storage:link
- 删除旧链接:
2. 核对文件存储路径与访问路径
- 你的代码中
storeAs('public/images', $fileName)会将文件存在storage/app/public/images/xxx.png,对应访问URL应为https://mysite/storage/images/xxx.png,这个逻辑是正确的。 - 检查数据库中存储的文件名是否仅为纯文件名(如
1695812089.png),不要包含storage/images/这类前缀。
3. 检查Web服务器配置
Nginx配置要点
确保服务器根目录指向项目的public文件夹,而非项目根目录,示例配置:
server { listen 443 ssl; server_name mysite.com; root /var/www/your-project/public; # 重点:指向public目录 index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
配置修改后重启Nginx:sudo systemctl restart nginx
Apache配置要点
- 确保
mod_rewrite模块已启用:sudo a2enmod rewrite - 在服务器配置中给项目
public目录设置AllowOverride All:<Directory /var/www/your-project/public> AllowOverride All </Directory> - 确认
public/.htaccess文件存在且未被修改,默认Laravel的.htaccess会处理路由重写。
4. 修复目录权限(避免用777)
不要用chmod 777这种不安全的权限,正确设置如下:
# 给web服务器用户赋予目录所有权 sudo chown -R www-data:www-data storage bootstrap/cache # 设置基础读写权限 sudo chmod -R 755 storage bootstrap/cache # 给公共存储目录添加写入权限(用于上传) sudo chmod -R 775 storage/app/public
5. 核对文件系统配置
检查config/filesystems.php中的public磁盘配置:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
- Laravel 9及以上版本,.env中设置
FILESYSTEM_DISK=public - 旧版本设置
FILESYSTEM_DRIVER=public
修改配置后清理缓存:
php artisan config:clear php artisan cache:clear
6. 验证文件可被Web服务器读取
以web服务器用户身份尝试读取目标图片,确认权限无问题:
sudo -u www-data cat storage/app/public/images/1695812089.png
如果能正常输出文件内容,说明文件本身权限没问题;如果报错,检查文件是否真的存在,或权限是否正确。
内容的提问来源于stack exchange,提问作者Jakeb S K
相关产品推荐
相关产品推荐

