You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

共享主机Live Server中public/storage图片无法显示求助

问题

存储在public/storage目录的图片在共享主机环境的线上服务器无法显示,但本地环境可正常显示。

相关代码

Trainee.php 方法

public function getProfilePicture()
{
  if ($this->picture && Storage::disk('public')->exists($this->picture) == 1) {
         return Storage::disk('public')->url($this->picture);
    }

    return asset('/images/blank_profile_picture.png');
}

Blade模板

<img src="{{ $trainee->getProfilePicture() }}">

filesystems.php 配置

'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app/private'),
            'serve' => true,
            'throw' => false,
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],
],

共享主机上执行的SSH命令

为存储目录设置符号链接执行的命令:

php artisan storage:link
  INFO  The [public/storage] link has been connected to [storage/app/public].
chmod -R 755 storage
chmod -R 755 public/storage

验证情况

执行命令后:

  1. 符号链接已成功创建:
ls -l public
lrwxrwxrwx 1 user user 61 Dec 17 10:22 storage -> /home/customer/www/.../storage/app/public

...为.env文件中APP_URL对应的应用路径

  1. 图片文件存在于storage/app/public/trainee-profile-pictures目录:
ls -l storage/app/public/trainee-profile-pictures/
-rwxrwxr-x 1 user user 26990 Dec 17 07:36 gAgoBddnYT7SH0eiV2u000bqZT5j2TGQjcoedHlj.jpg

预期结果

Trainee.php模型中的getProfilePicture()方法应返回图片的正确URL,Blade模板中的<img>标签应正常显示图片。

调试观察

图片实际路径:

  • /storage/app/public/trainee-profile-pictures/gAgoBddnYT7SH0eiV2u000bqZT5j2TGQjcoedHlj.jpg

调试时观察到的值:

$this->picture = trainee-profile-pictures/gAgoBddnYT7SH0eiV2u000bqZT5j2TGQjcoedHlj.jpg
Storage::disk('public')->exists($this->picture) = 1
$trainee->getProfilePicture() = https://.../storage/trainee-profile-pictures/gAgoBddnYT7SH0eiV2u000bqZT5j2TGQjcoedHlj.jpg
storage_path('app/public/'.$this->picture) =
/home/customer/www/.../storage/app/public/trainee-profile-pictures/gAgoBddnYT7SH0eiV2u000bqZT5j2TGQjcoedHlj.jpg

观察结论

  • 符号链接创建正常
  • 图片存在于指定目录
  • 但getProfilePicture()方法仍返回备用图片

求助需求

请指导以下问题:

  1. 符号链接或文件权限是否存在问题
  2. filesystems.php或主机环境是否存在配置错误
  3. 确保图片在Live Server正常显示的步骤

解决方案

1. 权限与符号链接排查

  • 检查父目录权限:确保/home/customer/www/.../storage和/home/customer/www/.../public权限为755,且所属用户与web服务器运行用户一致(通常是www-data或主机指定用户),避免权限继承导致无法读取。
  • 验证图片URL可访问性:直接在浏览器输入图片完整URL,若返回403,将图片权限改为644(755权限对文件可能被主机拦截);若返回404,重新创建绝对路径符号链接:
    rm public/storage
    ln -s /home/customer/www/.../storage/app/public /home/customer/www/.../public/storage
    

2. 配置与环境排查

  • 确认.env的APP_URL:必须是线上完整域名(如https://yourdomain.com),无末尾斜杠,且与符号链接路径匹配。
  • 验证storage_path准确性:通过php artisan tinker执行echo storage_path('app/public'),确认物理路径与实际存储目录一致。
  • 联系主机商关闭PHP安全模式:部分共享主机会限制symlink()函数或跨目录访问,这会导致符号链接失效。

3. 确保图片正常显示的步骤

  1. 按上述方法重新创建绝对路径符号链接,验证指向正确。
  2. 设置正确权限:
    chmod -R 755 /home/customer/www/.../storage
    chmod -R 644 /home/customer/www/.../storage/app/public/trainee-profile-pictures
    chmod 755 /home/customer/www/.../public/storage
    
  3. 清除Laravel缓存:
    php artisan config:clear
    php artisan cache:clear
    
  4. 检查.htaccess规则:若主机拦截storage目录访问,在public/.htaccess添加:
    <Directory "public/storage">
        AllowOverride All
        Require all granted
    </Directory>
    
  5. 修正方法逻辑:将exists($this->picture) == 1改为exists($this->picture)(exists()返回布尔值,与1比较可能存在类型转换问题):
    if ($this->picture && Storage::disk('public')->exists($this->picture)) {
        return Storage::disk('public')->url($this->picture);
    }
    

内容的提问来源于stack exchange,提问作者Faizan Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:15:59