如何在一台AWS EC2实例上读取另一台EC2实例的目录文件列表
问题核心原因
PHP的scandir()函数仅支持读取本地文件系统路径,不支持传入HTTP/HTTPS网络URL作为参数,因此你直接修改路径为实例2的HTTP地址必然无法运行,这个问题和安全组没有直接关系。
可行解决方案
你可以根据业务需求选择以下任意一种方案实现:
方案1(实现成本最低):实例2部署独立文件列表接口
在实例2的站点根目录下写一个简单的PHP接口,专门返回upload_directory下的非隐藏文件列表,实例1通过HTTP请求该接口获取结果即可。
实例2接口示例(命名为list_files.php放在站点根目录):<?php $path = "upload_directory/"; $files = scandir($path); $nothidden = []; foreach($files as $file) { if ($file[0] != '.') $nothidden[] = $file; } echo json_encode($nothidden); ?>实例1请求示例:
<?php $fileList = json_decode(file_get_contents("http://实例2公网IP/list_files.php"), true); foreach($fileList as $file) { echo $file."<br>"; } ?>该方案仅需要配置实例2的入站安全组,放开80/443端口给实例1的公网IP即可。
方案2(适合需要读写文件场景):跨实例挂载目录
用NFS、Samba这类网络文件共享协议,把实例2的upload_directory挂载到实例1的本地路径下,你原有的scandir()代码几乎不需要修改,直接读取挂载后的本地路径即可。该方案需要额外配置AWS安全组放开对应共享协议的端口(NFS默认2049端口)。方案3(适合高可用场景):统一存储到S3
如果后续文件量持续增长,可把所有文件迁移到AWS S3桶,两台实例都通过AWS SDK操作S3文件,实例1直接调用S3接口拉取文件列表,不需要依赖实例2的运行状态,可靠性更高,但改造成本也最高。
安全注意事项
- 选择方案1时建议给实例2的接口加简单鉴权逻辑,比如请求携带预定义密钥,或者严格限制接口仅允许实例1的IP访问,避免目录列表泄露。
- 不要直接给实例2的
upload_directory开Web目录索引权限,会直接暴露所有文件,存在安全隐患。
内容的提问来源于stack exchange,提问作者mojobullfrog
相关产品推荐
相关产品推荐

