【问题标题】:How to generate a presigned URI that allow several HTTP methods (here : GET and HEAD)?如何生成允许多种 HTTP 方法(此处为:GET 和 HEAD)的预签名 URI?
【发布时间】:2019-11-30 15:17:27
【问题描述】:

我正在使用适用于 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 请求。而且我不知道该怎么做。

(注意:所有这一切的目的是,我的客户可以在 URI 上执行 HEAD,以便在尝试下载文件之前知道文件的大小。因此,如果有可能生成预签名带有'GetObject' 的 URI,然后是一种让用户只从这个预签名的 URI 中检索文件大小的方法,我也很感激这个答案。)

【问题讨论】:

    标签: php amazon-s3 aws-sdk pre-signed-url


    【解决方案1】:

    到目前为止,您只能为一个对象和一个客户端方法生成预签名 URL。这可能会在未来发生变化,但谁知道何时发生。

    【讨论】:

      【解决方案2】:

      针对 GET 生成的 AWS S3 预签名 URL 上的 HEAD 请求将导致 403 Forbidden 响应。但是,您可以通过执行带有 Range 标头设置的 GET 请求,在预签名的 AWS S3 URL 上实现等效的 HEAD 请求,如下所示:

      Range: bytes=0-0
      

      此GET 请求将为您提供成功的206 Partial Content 响应,其中包含有关 S3 对象的信息,但不包含对象内容本身。如果您对对象的大小感兴趣,则需要从响应中的 Content-Range 标头获取此信息,而不是 Content-Length 标头,就像 HEAD 请求的情况一样(参见示例下面)。

      来自 Postman 的示例输出,带有 HEAD 和 GET(带有 Range Header)请求:

      最后,根据您发出请求的位置,您可能需要更新 S3 存储桶上的 CORS 策略,以将 Content-Range 标头公开给客户端,如果您希望在客户端代码中使用它。该政策将如下所示:

      [
          {
              "AllowedHeaders": [
                  ...
              ],
              "AllowedMethods": [
                  ...
              ],
              "AllowedOrigins": [
                  ...
              ],
              "ExposeHeaders": [
                  "Accept-Ranges",  # Required
                  "Content-Range",  # Required
                  ...
              ],
              ...
          }
      ]
      

      【讨论】:

        猜你喜欢
        • 2018-11-12
        • 1970-01-01
        • 2013-03-20
        • 2020-06-26
        • 2020-07-19
        • 2014-07-16
        • 2021-07-12
        • 2018-05-14
        • 1970-01-01
        相关资源
        最近更新 更多