Предварительная подписка на Amazon S3 для заголовка и получения глаголов

Я размещаю файлы на Amazon S3, которые я хочу сделать доступными, используя предварительно подписанные URL.

Для простых запросов GET это работает отлично. Однако есть несколько клиентов, которые сначала выполняют запрос HEAD (чтобы получить размер файла). Поскольку подпись в URL-адресе включает в себя http-глагол (GET vs HEAD), запрос главы терпит неудачу.

Клиент просто выполняет:

HEAD http://(bucketname).s3.amazonaws.com/filename?AWSAccessKeyId=(mykey)&Expires=(timestamp)&Signature=(sig)
GET http://(bucketname).s3.amazonaws.com/filename?AWSAccessKeyId=(mykey)&Expires=(timestamp)&Signature=(sig)

Я не могу изменить клиентов, чтобы использовать другой url для головы и получить. Есть ли способ сделать amazon использовать подпись, которая принимает как HEAD, так и GET для одного и того же ресурса?

Ответ 1

Вы также можете смоделировать поведение HEAD с помощью GET если указали заголовок Range для первого байта. Разница будет в том, что вы получите 206 вместо 200 кода. Во-вторых, полный размер будет в заголовке Content-Range.

curl -H "Range: bytes=0-0" <URL>

Ответ 2

Нет. HEAD и GET нужны разные подписи, так как есть тонкие различия в входах подписи.

Не уверен, что вы используете для создания предварительно подписанных URL-адресов проверки подлинности, но я знаю, что некоторые из официальных SDK SDS справляются с этим, в то время как другие еще не сделали.

Ответ 3

с помощью друга я нашел решение, которое работает для меня: прокси-запрос HEAD на моем сервере и перенаправление для запроса GET.

Когда запрос поступает с HEAD-глаголом, чтобы получить информацию о файле, я использую свой код S3 на своем сервере, чтобы получить информацию HEAD, а затем я отправил его самому запрашивающему.

Когда запрос приходит с помощью GET-глагола для получения самого файла, я делаю перенаправление 302 с заранее подписанным URL-адресом.

это отлично работает для обработки как HEAD, так и GET, не требуя предварительной подписывать оба. Я только предварительно подписываю запрос GET для фактического файла.