0

适用于我的内容的网址是

https://<bucket>.s3.amazonaws.com/<object> http://<bucket>.s3.amazonaws.com/<object>
<bucket>.s3.amazonaws.com/<object>
s3.amazonaws.com/<bucket>/<object>

我希望这个 URL 工作

<bucket>/<object>

但它不起作用。

此代码有效

$request = $client->get("http://{$bucket}.s3.amazonaws.com/{$s3name}");
return $client->createPresignedUrl($request, $time);

这段代码不

$request = $client->get("http://{$bucket}/{$s3name}");
return $client->createPresignedUrl($request, $time);

有人可以帮我吗?我必须有 https 才能完成这项工作吗?我也添加了 CNAME。

4

2 回答 2

0

在对您将使用主机名中的“s3.amazon...”组件访问的存储桶的请求进行签名时,要签名的字符串包括资源,如下所示:

/bucket/object

自然的结论是,如果您使用的是虚拟托管存储桶,那么资源将如下所示:

/object

但是,这是不正确的。您仍然需要在字符串中的对象名称之前使用存储桶名称来签名,即使它不包含在 url 的路径部分中(因为 s3 从 Host: 标头中提取它)。

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html

为了验证这一点,您可以手动获取由您在“此代码有效”下显示的代码生成的签名 URL,将主机名更改为您的存储桶名称,从路径中删除存储桶,您应该会发现签名仍然有效,即使尽管您已手动将 url 重写为所需的格式。

于 2013-08-26T12:24:49.673 回答
0

为此,您需要使用虚拟主机:http ://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

这涉及两个部分 - 首先,使用您想要的主机名设置一个 CNAME。接下来,确保在发出请求时发送正确的主机名。从文档:

GET /homepage.html HTTP/1.1
Host: johnsmith.net.s3.amazonaws.com
于 2013-08-25T12:08:07.710 回答