如何生成允许多种 HTTP 方法(此处:GET 和 HEAD)的预签名 URI?
How to generate a presigned URI that allow several HTTP methods (here : GET and HEAD)?
我正在为 PHP 使用 aws s3 sdk,您可以在其中轻松生成预签名 URI,如下所示:
$cmd = $my_S3Client->getCommand(
'GetObject', [
'Bucket' => 'my_bucket',
'Key' => 'a_file.txt']);
$a_presigned_uri = $my_S3Client
->createPresignedRequest($cmd, $lifespan);
->getUri();
并且此 URI 只能通过 GET 查询。
现在,如果我想创建一个可通过 HEAD 请求查询的预签名 URI,我只需编写相同的代码,但要替换
->getCommand('GetObject', [...])
和
->getCommand('HeadObject', [...])
这两个都很完美。
但我希望能够生成一个预签名的 URI,我们可以在该 URI 上请求 GET 或 HEAD 请求。而且我不知道该怎么做。
(注意:objective 所有这一切,是我的客户可以在 URI 上做一个 HEAD,以便在他尝试下载文件之前知道文件的大小。所以如果有可以使用 'GetObject'
生成预签名的 URI,然后用户可以仅从这个预签名的 URI 中检索文件的大小,我也很欣赏这个答案。)
截至目前,您只能为一个对象和一个客户端方法生成 pre-signed 个 URL。这可能会在未来改变,但谁知道什么时候。
为 GET
生成的 AWS S3 pre-signed URL 上的 HEAD
请求将导致 403 Forbidden
响应。但是,您可以通过使用 Range
header 设置的 GET
请求在 pre-signed AWS S3 URL 上实现与 HEAD 请求等效的设置,如下所示:
Range: bytes=0-0
此 GET
请求会给您一个成功的 206 Partial Content
响应,其中包含有关 S3 object 的信息,但没有 object 内容本身。如果您对 object 的大小感兴趣,则需要从响应中的 Content-Range
header 获取此信息,而不是 Content-Length
[=41] =] 与 HEAD
请求的情况一样(参见下面的示例)。
同时包含 HEAD
和 GET
(范围 Header)请求的 Postman 输出示例:
最后,根据您发出请求的位置,您可能需要更新 S3 存储桶上的 CORS 策略以向客户端公开 Content-Range
header(如果您希望使用它)从客户端代码。该政策将如下所示:
[
{
"AllowedHeaders": [
...
],
"AllowedMethods": [
...
],
"AllowedOrigins": [
...
],
"ExposeHeaders": [
"Accept-Ranges", # Required
"Content-Range", # Required
...
],
...
}
]
我正在为 PHP 使用 aws s3 sdk,您可以在其中轻松生成预签名 URI,如下所示:
$cmd = $my_S3Client->getCommand(
'GetObject', [
'Bucket' => 'my_bucket',
'Key' => 'a_file.txt']);
$a_presigned_uri = $my_S3Client
->createPresignedRequest($cmd, $lifespan);
->getUri();
并且此 URI 只能通过 GET 查询。
现在,如果我想创建一个可通过 HEAD 请求查询的预签名 URI,我只需编写相同的代码,但要替换
->getCommand('GetObject', [...])
和
->getCommand('HeadObject', [...])
这两个都很完美。
但我希望能够生成一个预签名的 URI,我们可以在该 URI 上请求 GET 或 HEAD 请求。而且我不知道该怎么做。
(注意:objective 所有这一切,是我的客户可以在 URI 上做一个 HEAD,以便在他尝试下载文件之前知道文件的大小。所以如果有可以使用 'GetObject'
生成预签名的 URI,然后用户可以仅从这个预签名的 URI 中检索文件的大小,我也很欣赏这个答案。)
截至目前,您只能为一个对象和一个客户端方法生成 pre-signed 个 URL。这可能会在未来改变,但谁知道什么时候。
为 GET
生成的 AWS S3 pre-signed URL 上的 HEAD
请求将导致 403 Forbidden
响应。但是,您可以通过使用 Range
header 设置的 GET
请求在 pre-signed AWS S3 URL 上实现与 HEAD 请求等效的设置,如下所示:
Range: bytes=0-0
此 GET
请求会给您一个成功的 206 Partial Content
响应,其中包含有关 S3 object 的信息,但没有 object 内容本身。如果您对 object 的大小感兴趣,则需要从响应中的 Content-Range
header 获取此信息,而不是 Content-Length
[=41] =] 与 HEAD
请求的情况一样(参见下面的示例)。
同时包含 HEAD
和 GET
(范围 Header)请求的 Postman 输出示例:
最后,根据您发出请求的位置,您可能需要更新 S3 存储桶上的 CORS 策略以向客户端公开 Content-Range
header(如果您希望使用它)从客户端代码。该政策将如下所示:
[
{
"AllowedHeaders": [
...
],
"AllowedMethods": [
...
],
"AllowedOrigins": [
...
],
"ExposeHeaders": [
"Accept-Ranges", # Required
"Content-Range", # Required
...
],
...
}
]