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

Laravel在线环境图片上传失败求助:.htaccess配置后无法存储访问

解决线上环境图片上传后无法访问的问题

结合你的场景(服务器通过.htaccess指向public目录,本地正常线上异常),我整理了几个核心排查方向,你可以一步步来:

1. 检查Laravel存储软链接是否正确创建

Laravel默认依赖public/storage软链接指向../storage/app/public,本地开发环境通常会自动生成,但线上服务器(尤其是共享主机)经常因为权限或环境限制没创建这个链接,这是最常见的原因。

  • 解决方法:
    • 如果能通过SSH访问服务器,进入项目根目录执行:
      php artisan storage:link
      
    • 如果无法执行Artisan命令,手动创建软链接:
      • 用FTP工具在public目录下新建名为storage的链接,目标指向../storage/app/public;
      • 或者通过SSH执行:
        ln -s /path/to/your/project/storage/app/public /path/to/your/project/public/storage
        
    注意:因为你的.htaccess把网站根指向了public,所以这个软链接必须在public目录下,才能让/storage/images/xxx的请求正确映射到实际存储的文件。

2. 验证服务器文件权限

线上服务器的storage和public/storage目录需要有足够的读写权限,否则图片要么上传失败,要么保存后无法被web服务器读取。

  • 解决方法:
    • 给storage目录设置合适的权限(通常755即可,具体根据服务器配置调整):
      chmod -R 755 storage/
      
    • 同时确保public/storage(或者你手动创建的软链接)的权限也正确,web服务器用户(比如www-data、apache)需要有读取权限。

3. 替换硬编码路径为Laravel辅助函数

你当前用硬编码的/storage/images/{{$retour->images}},可能因为.htaccess的路径映射导致实际请求路径错误。建议用Laravel的asset()辅助函数生成适配环境的绝对URL:

  • 修改展示/下载代码:
    <tr>
      <th>Foto's</th>
      @if( $retour->images === 'noimage.jpg')
      <td>Geen foto beschikbaar</td>
      @else
      <td>
        <a download="retourmelding_{{$retour->firmaname}}" href="{{asset('storage/images/'.$retour->images)}}" title="Foto">
          <img alt="Foto" src="{{asset('storage/images/'.$retour->images)}}">
        </a>
      </td>
      @endif
    </tr>
    

asset()会根据当前环境的配置(比如APP_URL)生成正确的绝对路径,避免路径冲突。

4. 确认文件是否真的上传到服务器

先排查文件是否成功保存:

  • 登录服务器,进入storage/app/public/images目录,看看有没有上传的图片文件;
  • 如果文件不存在:说明上传过程失败,可能是服务器的PHP上传限制(比如upload_max_filesize、post_max_size太小),或者storage目录权限不足导致无法写入;
  • 如果文件存在但访问不了:那就是路径映射或权限的问题,回到前两步排查。

备选方案(如果无法创建软链接)

如果服务器完全禁止创建软链接,可以修改存储路径,直接把图片存在public目录下:

  • 修改控制器代码的存储路径:
    // 把 storeAs('public/images', $fileNameToStore) 改成
    $request->file('image')->storeAs('images', $fileNameToStore);
    
    这样文件会直接存在public/images目录下;
  • 同时修改展示路径为{{asset('images/'.$retour->images)}},确保public/images目录有写入权限。

内容的提问来源于stack exchange,提问作者Othman Boūlal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:58:33