Предварительная подписка на 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 для фактического файла.