升级Minio 3.1.13至4.0.4后,S3存储桶URL格式异常求助
解决Minio 4.0.4版本访问Amazon S3时URL生成错误的问题
你的问题核心是Minio 4.x SDK在调用ListObjectsAsync时未生成带桶名和区域的正确虚拟主机样式URL,导致请求被S3重定向失败。可通过以下两种方式修复:
方案1:使用区域化的S3端点并启用虚拟主机样式
修改客户端初始化代码,直接使用对应区域的S3端点,同时显式启用虚拟主机样式:
var bucket = "my-bucket-name"; var filePrefix = "379c05ee-d204-4dc7-b26b-66ad8f9e68d4/"; var _mediaClient = new Minio.MinioClient() .WithEndpoint("s3-eu-west-2.amazonaws.com") .WithCredentials("accessKey", "secretKey") .WithSSL() .WithForcePathStyle(false); // 启用虚拟主机样式,匹配S3的URL规则 var exists = await _mediaClient.BucketExistsAsync(bucket); if (exists) { ListObjectsArgs args = new ListObjectsArgs() .WithBucket(bucket) .WithPrefix(filePrefix) .WithRecursive(true) .WithListObjectsV1(false); IObservable<Item> observable = _mediaClient.ListObjectsAsync(args); var files = await observable.Select(item => item.Key).ToList(); }
方案2:保留通用S3端点,显式配置区域和虚拟主机样式
如果需要保留使用s3.amazonaws.com作为端点,需确保同时配置区域和启用虚拟主机样式:
var _mediaClient = new Minio.MinioClient() .WithEndpoint("s3.amazonaws.com") .WithCredentials("accessKey", "secretKey") .WithRegion("eu-west-2") .WithSSL() .WithForcePathStyle(false);
原因说明
Minio 3.x版本默认使用虚拟主机样式生成URL(bucket.s3-region.amazonaws.com),而4.x版本的SDK默认行为发生了变化,需要显式通过WithForcePathStyle(false)启用虚拟主机样式,否则会生成不符合S3规则的请求地址,触发永久重定向导致请求失败。
内容的提问来源于stack exchange,提问作者Mr Giggles
相关产品推荐
相关产品推荐

