Laravel接入MinIO无需修改业务代码,仅需调整config/filesystems.php和.env两处配置即可将Storage::put()、Storage::url()从AWS S3无缝切换至本地MinIO,大幅降低存储成本;但须确保API端口对外可达、use_path_style_endpoint设为true、桶策略通过mc命令行实际写入,缺一不可。

直接上结论:Laravel 接 MinIO 不用改业务代码,只改 config/filesystems.php 和 .env 两处,就能把原本打给 AWS S3 的 Storage::put()、Storage::url() 全部切到本地 MinIO,月租从几百块降到几块钱电费——前提是别踩权限、端口、路径风格这三类坑。
MinIO 启动时必须指定 --address 和 --console-address 两个端口
很多人启动后发现 Laravel 调用超时或返回 403,第一反应是配置错了,其实大概率是端口混淆。MinIO 默认把 API(程序调用)和 Console(网页管理)绑在同一个端口(9000),但生产环境必须分开:
-
--address ":9005"是 API 端口,Laravel 的MINIO_ENDPOINT必须指向这里,不是 9000 -
--console-address ":9000"是 Web 控制台端口,浏览器访问用它 - Windows 下用
minio.exe server E:\MinIO\data --address ":9005" --console-address ":9000",Linux 下同理 - 如果漏掉
--address,MinIO 会默认监听localhost:9000,外部网络(比如 Laravel 所在容器或另一台机器)根本连不上
Laravel 配置里 use_path_style_endpoint 必须设为 true
MinIO 默认不启用虚拟主机式桶访问(即 https://bucket.example.com/file),而用路径式(https://example.com/bucket/file)。AWS S3 在新区域默认用虚拟主机,但 MinIO 只支持路径式——否则 Storage::url() 生成的链接 404。
- 在
config/filesystems.php的miniodisk 配置中,加这一行:'use_path_style_endpoint' => true - 不加的话,Laravel 会尝试拼出
https://my-bucket.127.0.0.1:9005/file.jpg,而 MinIO 根本不响应这个 Host - 哪怕你用 Nginx 做了反代,只要没开虚拟主机支持,也得设为
true
mc 客户端是唯一可靠方式设置桶公开读写策略
MinIO 新版 Web 控制台(9000 端口)里点“Edit Policy”根本不起作用,UI 提交后策略不生效,导致前端 Storage::url() 返回的链接打不开图片——这是最常被卡住的点。
- 必须用
mc命令行工具:先mc alias set myminio http://127.0.0.1:9005 admin123 admin123 - 再执行
mc anonymous set download myminio/my-bucket(允许匿名下载) - 如果还要上传,用
mc anonymous set upload myminio/my-bucket - 别信控制台里那个 “Read” 复选框,它只改 UI 显示,不发真实请求
- 验证是否生效:
curl -I http://127.0.0.1:9005/my-bucket/test.jpg应返回 200,不是 403
真正麻烦的不是装 MinIO,而是确认三点:API 端口对外可达、路径式 endpoint 开启、桶策略由 mc 实际写入。少一个,Storage::url() 就是死链,前端加载不出图,后端日志里还找不到明确报错。











