Использование PHP curl для получения файла тега релиза из github. Github отвечает заголовком перенаправления на S3, за которым следует cURL. Например:
https://github.com/twbs/bootstrap/releases/download/v3.3.1/bootstrap-3.3.1-dist.zip
Результатом является 302 с заголовком местоположения для s3 с различными деталями аутентификации
https://s3.amazonaws.com/github-cloud/releases/2126244/558cd3fe-6a4b-11e4-9a0e-d0e8b6837eb8.zip?response-content-disposition=attachment%3b%20filename%3dbootstrap-3.3.1-dist.zip&response-content-type=application/octet-stream&awsaccesskeyid=akiaistnzfovbijmk3tq&expires=1417038428&signature=rn98zc%2bxrlhdjpbrulsptthsyee%3d
После заголовка местоположения перенаправления Amazon отвечает 400
Заголовки конкретных запросов не могут использоваться для анонимных запросов GET.
В качестве эксперимента я попытался отправить местоположение перенаправления как POST, а также с помощью CURLOPT_CUSTOMREQUEST, установленного в GET, и поместить параметры GET в CURLOPT_POSTFIELDS. Это приводит к 405. Указанный метод не разрешен для этого ресурса.
Код PHP является базовым cURL и устанавливает следующее:
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => 1,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 10,
CURLOPT_MAXREDIRS => 3,
CURLOPT_ENCODING => 'gzip,deflate',
CURLOPT_POST => 0,
Это также устанавливает
CURLOPT_REFERER
на перенаправлении
Выполнение прямого скручивания -L в командной строке * nix работает нормально, хотя, похоже, что-то вроде того, как PHP обрабатывает или нет детали перенаправления
Вставленный вами URL-адрес недействителен, как показано, поскольку три параметра строки запроса были преобразованы — как-то — в нижний регистр. Они должны быть…
AWSAccessKeyID
Expires
Signature
Значения из AWSAccessKeyID и Signature также приводятся к нижнему регистру, что также неверно. Они тоже определенно чувствительны к регистру.
response-content-*
параметры верны, как показано.
Я не эксперт по php, поэтому я понятия не имею, как это могло бы произойти, но неправильный регистр в именах этих чувствительных к регистру имен приведет именно к той ошибке, которую вы видите, поскольку S3 считает запрос анонимным, и анонимные запросы не поддерживают настройку атрибутов ответа через строку запроса.
Это также кажется мне неправильным, но не ясно, почему, в свете этого, перенаправление вообще будет выполняться:
CURLOPT_FOLLOWLOCATION => 0,
Других решений пока нет …