我正在生成预先签名的网址,但由于*.s3.amazonaws证书,因此对于具有句点和SSL的存储桶名称存在问题,如下所述:http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using- 虚拟host.html
有没有办法生成具有以下格式的网址?:http: //s3.amazonaws.com/bucket.name/key
我没有在API中看到一个选项.我猜我可以通过重新排列网址来"手动"完成它,但如果没有必要,我宁愿避免黑客入侵.
基于迈克尔的答案,这里是我现在使用的代码:
public static URL bucketNameAfterS3Url(URL url) {
int index = url.getHost().indexOf("s3");
String host = url.getHost().substring(index);
String bucket = url.getHost().substring(0, index - 1);
URL toUse;
try {
toUse = new URL(url.getProtocol(), host, url.getPort(), '/' + bucket + url.getFile());
} catch (MalformedURLException e) {
}
return toUse;
}
Run Code Online (Sandbox Code Playgroud)
S3客户端允许您设置一个选项来配置:
// Configure the S3 client to generate urls with valid SSL certificates. With this setting we will get urls
// like https://s3.amazonaws.com/bucket_name/... but if this is not set we will get urls like
// https://bucket_name.s3.amazonaws.com/ which will cause the browser to complain about invalid SSL
// certificates.
s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));
Run Code Online (Sandbox Code Playgroud)
没有任何官方方法可以做到这一点,但字符串操作并不像看起来那么粗略,因为可能的模式是有限的。存储桶名称不能包含斜杠,并且查找其他元素非常安全。
一个重要的考虑因素是区域,以及它如何影响 URL 的有效组合。
考虑存储桶“example-bucket”中的“lolcat.jpg”...
https://example-bucket.s3.amazonaws.com/lolcat.jpg
https://s3.amazonaws.com/example-bucket/lolcat.jpg
Run Code Online (Sandbox Code Playgroud)
仅当存储桶位于美国标准区域时,这两个 URL 才等效。
如果没有,顶部的一个可以工作,但底部的一个将返回一条错误消息,告诉您使用了错误的端点。
对于其他区域,您必须使用正确的区域终端节点。如果是 us-west-2,这实际上是:
https://s3-us-west-2.amazonaws.com/example-bucket/lolcat.jpg
Run Code Online (Sandbox Code Playgroud)
因此,您必须先知道存储桶的区域,然后才能转置 URL 中的元素。
如果您使用的是签名版本 4,那么您已经知道该区域,因为生成签名需要它。使用签名版本 2,由于该算法的详细信息,您甚至可以在对 URL 进行签名后重新排列 URL 中存储桶名称的位置,而无需使签名无效。
| 归档时间: |
|
| 查看次数: |
3053 次 |
| 最近记录: |