如何用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
相关产品推荐
相关产品推荐

