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

如何在一台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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:24:02