部署Laravel项目到AWS EC2时上传文件与图片的存储目录选择问题
Laravel 项目上传文件存储目录问题解答
当前存储方案的合理性判断
你当前直接将用户上传的文件和图片存放在public目录下的方案不推荐用于生产环境,主要存在3个核心问题:
- 部署新版本时,如果你通过代码同步、Git拉取等方式覆盖
public目录,很容易误删历史上传的用户文件 public是Web服务器直接暴露的根目录,若攻击者上传伪装成图片的恶意可执行脚本,直接访问路径即可触发脚本执行,存在严重安全隐患- 后续如果需要扩容、切换云存储方案(比如AWS S3),存储在
public目录的文件适配成本极高,无法复用Laravel自带的文件系统抽象层能力
推荐的本地存储路径
Laravel官方默认推荐的用户上传文件本地存储目录为storage/app/public,优势如下:
- 该目录默认不在Web服务器的公开访问范围内,即使有恶意文件上传,也无法直接通过HTTP请求执行,安全性更高
- 该目录默认被加入
.gitignore,部署拉取代码时不会被覆盖,历史上传文件可以永久保留 - 适配Laravel文件系统抽象层,后续切换云存储只需要修改配置文件,不需要调整业务代码
适配修改步骤
你只需要做少量调整即可完成方案切换,原有asset()读取资源的逻辑几乎不用大改:
- 将当前存放在
public目录下的上传文件、图片全部移动到storage/app/public的对应子目录中 - 在项目根目录执行命令
php artisan storage:link,Laravel会自动在public目录下创建指向storage/app/public的软链接,相当于把存储目录映射到了Web可访问的路径下 - 原有调用
asset()的代码只需要调整路径前缀即可,比如之前写asset('upload/1.jpg'),现在改成asset('storage/upload/1.jpg')就可以正常访问 - 部署到AWS EC2时,只需要在部署脚本中加入执行
php artisan storage:link的步骤,同时确保部署流程不会覆盖storage/app/public目录的内容即可
内容的提问来源于stack exchange,提问作者Mohamed Yehia
相关产品推荐
相关产品推荐

