Полностью отключить перенаправление для Guzzle

У Guzzle6 есть один симпатичный вариант: allow_redirects. Если для этой опции установлено значение false, Guzzle блокирует перенаправление, если код ответа, такой как 302 или Headers, имеет параметр Location.

Но есть одна проблема. Если редирект отправляет клиент — Guzzle этого не замечает. Например:

У нас есть URL-адрес http://example.com/, который ведет на страницу http://redirected.com/. Отправить запрос с помощью Guzzle:

$oClient->request('POST', 'http://redirected.com/', [
    'form_params' => $aFormData,
    'cookies' => (new CookieJar($aPrepareCookie)),
    'debug' => true,
    'allow_redirects' => false
]);

Предположим, что redirect.com имеет index.php вот так:

<?php
    header('Location: http://www.example.com/');
?>

В этом случае перенаправление с Guzzle будет заблокировано.

Теперь давайте посмотрим на этот пример перенаправления:

<?php
    echo '<script>window.location = "http://www.example.com/";</script>';
?>

Здесь у нас есть проблема, потому что это перенаправление на стороне клиента, и он не может повлиять на Headers, поэтому Guzzle не может отслеживать код состояния HTTP или значение местоположения.

Итак, как я могу решить эту проблему и найти решение?

Спасибо за помощь!


person RomanGorbatko    schedule 24.11.2015    source источник
comment
guzzle не выполняет javascript, он просто выполняет HTTP-запрос - ваша проблема должна быть решена ниже по течению, поскольку она заключается в том, что вы делаете с содержимым запроса.   -  person Calimero    schedule 24.11.2015
comment
@Calimero вы предлагаете получить страницу, на которой есть window.location и вырезать это, например. Но не может получить страницу, потому что сразу выполняется перенаправление.   -  person RomanGorbatko    schedule 24.11.2015
comment
Я подозреваю, что вы выполняете запрос с жадностью на веб-странице и отправляете содержимое запроса клиенту - только веб-браузер выполнит перенаправление JS. Guzzle, будучи только HTTP-клиентом, не может справиться с этим за вас. но вы легко можете отфильтровать содержимое ответа, если это необходимо.   -  person Calimero    schedule 24.11.2015


Ответы (1)


Как уже говорилось в предыдущих постах, Guzzle не будет выполнять javascript.

Вашу проблему можно легко решить с помощью Guzzle Middleware.

В промежуточном программном обеспечении:

  • получить ответ
  • разобрать тело на наличие window.location="someurl"
  • выполнить просьбу "someurl"
  • измените заголовок ответа от «someurl», чтобы включить тот факт, что это было перенаправление.
  • вернуть ответ.
person Shaun Bramley    schedule 24.11.2015