Здесь происходит ряд вещей.
Во-первых, указанная вами ссылка говорит об URL-адресах Cloudfront.Я не думаю, что возможно заменить символы в URL-адресах S3, как обсуждалось.
Во-вторых, вы не должны изменять знаки =
сразу после AWSAccessKeyId
, Expires
и Signature
.Проблемные символы - только те, которые появляются в строке подписи.В вашем примере %3D
в конце - =
в URL, закодированном из, и это то, что вам нужно изменить.
Проблема, однако, в том, что если вы измените этот символ, подпись больше не действительнаи именно поэтому закрытый контент больше не доступен.Общедоступный контент будет доступен, поскольку часть аутентификации URL-адреса просто игнорируется Amazon.
Я столкнулся с подобной проблемой с видеопроигрывателем на основе Silverlight, которая не работала, если было +
(%2b
) символовв URL.Я решил это, просто сгенерировав новый URL в цикле, пока у меня не было того, у которого не было недопустимых символов.Ключ заключается в том, чтобы немного изменить время истечения, чтобы изменить сгенерированную подпись.
Вот пример использования AWS SDK.(преобразовано из vb.net, поэтому я надеюсь, что синтаксис правильный)
using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSKey, AWSSecretKey)) {
string url = null;
int secs = 0;
do {
var req = new Model.GetPreSignedUrlRequest {
BucketName = bucket,
Key = key,
Protocol = Model.Protocol.HTTP,
Verb = Model.HttpVerb.GET,
Expires = DateTime.Now.AddDays(ExpiryInDays).AddSeconds(secs)
};
url = client.GetPreSignedURL(req);
secs += 1;
} while (url.ToLower().Contains("%2b"));
return url;
}
По моему опыту, снижение производительности незначительно, так как обычно для обеспечения «чистого» URL требуется всего пара итераций.