12

如果我生成的预签名 URL 已过期,我是否应该get_headers()(在 PHP 中)查看是否403 Forbidden引发错误,否则使用相同的 URL?或者这是一个坏主意,因为它是一个不必要的 GET 请求?我是否应该每次都重新生成一个新的预签名 URL?我有点困惑,因为似乎没有太多关于此的信息。

4

3 回答 3

25

URL 的过期时间。

签名版 2

htt ps://bucket.s3.amazonaws.com/foo.txt?AWSAccessKeyId=AKIAABCDEFGHIJK& Expires=1508608760 &Signature=xxxxxxxxxxx

Expires以 Unix 时间戳(以秒为单位)和协调世界时 (UTC) 给出时间。

$ date -d @1508608760
Sat Oct 21 17:59:20 UTC 2017

您可以提取该值并将其与 UTC [ time()] 中的当前时间进行比较,然后决定是否重新生成。


签名版本 4

htt ps://s3.amazonaws.com/bucket/foo.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Expires=3600&X-Amz-Credential=AKIAJRZXXXXXXXXXus-east-1%2Fs3%2Faws4_request&X- Amz-SignedHeaders=主机& X-Amz-Date=20171021T190750Z &X-Amz-Signature=8b84ae9b59e9f8a8d7066ecc39e797c8dc29848abcdef61717

X-Amz-Date以 ISO 8601 格式提供 UTC 时间。

您可以提取该值,将其转换为 epoch/UTC 并将其与 UTC [time()] 中的当前时间进行比较,然后决定是否重新生成。

于 2017-10-21T17:03:40.760 回答
3

在 macOS 上,使用date -r 1535416265.

于 2018-08-27T13:27:40.033 回答
0

If you use Memcached (or similar), you have the option to push the presigned url in Memcached with the same expiration time. Something like this (pseudo-php code):

$mc->set($your_key, $url, $expiration);

So, you can get the url using

$url = $mc->get($your_key);

If $mc->get returns false, you have to re-generate the presigned url.

于 2018-06-22T19:16:04.000 回答