запрос на перенаправление cURL на amazon s3 возвращает код 400

Использование 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 обрабатывает или нет детали перенаправления

0

Решение

Вставленный вами URL-адрес недействителен, как показано, поскольку три параметра строки запроса были преобразованы — как-то — в нижний регистр. Они должны быть…

AWSAccessKeyID
Expires
Signature

Значения из AWSAccessKeyID и Signature также приводятся к нижнему регистру, что также неверно. Они тоже определенно чувствительны к регистру.

response-content-* параметры верны, как показано.

Я не эксперт по php, поэтому я понятия не имею, как это могло бы произойти, но неправильный регистр в именах этих чувствительных к регистру имен приведет именно к той ошибке, которую вы видите, поскольку S3 считает запрос анонимным, и анонимные запросы не поддерживают настройку атрибутов ответа через строку запроса.

Это также кажется мне неправильным, но не ясно, почему, в свете этого, перенаправление вообще будет выполняться:

 CURLOPT_FOLLOWLOCATION => 0,
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]