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

如何用aws-sdk-php(v3.305.1)匿名客户端列出公开AWS S3存储桶对象?

解决AWS SDK for PHP访问公开S3存储桶的授权错误

1. 修复代码语法错误

你的代码数组元素间缺少逗号,这会导致PHP解析异常,间接引发SDK的授权错误。修正后的代码:

$s3Client = new S3Client([
   "version" => "latest",
   "region" => "us-east-1",
   "credentials" => false // 公开存储桶无需凭证
]);

$data = $s3Client->listObjectsV2([
   "bucket" => "my bucket name"
]);

务必保证数组每个键值对末尾(除最后一个外)添加逗号,避免语法解析问题。

2. 显式配置匿名请求参数

若语法修正后仍报错,尝试强制指定签名版本并启用路径样式访问:

$s3Client = new S3Client([
    "version" => "latest",
    "region" => "us-east-1",
    "credentials" => false,
    "signature_version" => "s3",
    "use_path_style_endpoint" => true
]);
  • signature_version => "s3":强制使用S3兼容的简单签名模式,避免生成无效的授权头。
  • use_path_style_endpoint:针对包含特殊字符的存储桶名称,路径样式访问可避免DNS解析冲突,确保请求正确到达S3服务。

3. 验证存储桶的公开权限

确保存储桶的桶策略允许匿名用户执行ListObjectsV2操作,示例桶策略如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::your-bucket-name"
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}

注意:s3:ListBucket是执行listObjectsV2的必需权限,仅配置GetObject只能访问单个对象,无法列出桶内文件。

4. 排除环境中的无效凭证干扰

AWS SDK会自动从环境变量、本地凭证文件等来源加载凭证,即使你设置了credentials => false,若环境中存在不完整的凭证(如仅设置了Access Key),SDK仍会尝试生成无效授权头。

解决方式:

  • 清空环境变量中的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。
  • 删除或重命名运行环境中的~/.aws/credentials配置文件。
  • 显式使用AnonymousCredentials实例替代credentials => false:
use Aws\Credentials\AnonymousCredentials;

$s3Client = new S3Client([
    "version" => "latest",
    "region" => "us-east-1",
    "credentials" => new AnonymousCredentials(),
]);

这种方式更明确地强制SDK使用完全匿名请求,避免环境凭证的干扰。


内容的提问来源于stack exchange,提问作者MajesticOverlord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:43:42