==============
|
HTTP redirects
|
==============
|
|
By default, Guzzle will automatically follow redirects using the non-RFC compliant implementation used by most web
|
browsers. This means that redirects for POST requests are followed by a GET request. You can force RFC compliance by
|
enabling the strict mode on a request's parameter object:
|
|
.. code-block:: php
|
|
// Set per request
|
$request = $client->post();
|
$request->getParams()->set('redirect.strict', true);
|
|
// You can set globally on a client so all requests use strict redirects
|
$client->getConfig()->set('request.params', array(
|
'redirect.strict' => true
|
));
|
|
By default, Guzzle will redirect up to 5 times before throwing a ``Guzzle\Http\Exception\TooManyRedirectsException``.
|
You can raise or lower this value using the ``redirect.max`` parameter of a request object:
|
|
.. code-block:: php
|
|
$request->getParams()->set('redirect.max', 2);
|
|
Redirect history
|
----------------
|
|
You can get the number of redirects of a request using the resulting response object's ``getRedirectCount()`` method.
|
Similar to cURL's ``effective_url`` property, Guzzle provides the effective URL, or the last redirect URL that returned
|
the request, in a response's ``getEffectiveUrl()`` method.
|
|
When testing or debugging, it is often useful to see a history of redirects for a particular request. This can be
|
achieved using the HistoryPlugin.
|
|
.. code-block:: php
|
|
$request = $client->get('/');
|
$history = new Guzzle\Plugin\History\HistoryPlugin();
|
$request->addSubscriber($history);
|
$response = $request->send();
|
|
// Get the last redirect URL or the URL of the request that received
|
// this response
|
echo $response->getEffectiveUrl();
|
|
// Get the number of redirects
|
echo $response->getRedirectCount();
|
|
// Iterate over each sent request and response
|
foreach ($history->getAll() as $transaction) {
|
// Request object
|
echo $transaction['request']->getUrl() . "\n";
|
// Response object
|
echo $transaction['response']->getEffectiveUrl() . "\n";
|
}
|
|
// Or, simply cast the HistoryPlugin to a string to view each request and response
|
echo $history;
|
|
Disabling redirects
|
-------------------
|
|
You can disable redirects on a client by passing a configuration option in the client's constructor:
|
|
.. code-block:: php
|
|
$client = new Client(null, array('redirect.disable' => true));
|
|
You can also disable redirects per request:
|
|
.. code-block:: php
|
|
$request = $client->get($url, array(), array('allow_redirects' => false));
|
|
Redirects and non-repeatable streams
|
------------------------------------
|
|
If you are redirected when sending data from a non-repeatable stream and some of the data has been read off of the
|
stream, then you will get a ``Guzzle\Http\Exception\CouldNotRewindStreamException``. You can get around this error by
|
adding a custom rewind method to the entity body object being sent in the request.
|
|
.. code-block:: php
|
|
$request = $client->post(
|
'http://httpbin.com/redirect/2',
|
null,
|
fopen('http://httpbin.com/get', 'r')
|
);
|
|
// Add a custom function that can be used to rewind the stream
|
// (reopen in this example)
|
$request->getBody()->setRewindFunction(function ($body) {
|
$body->setStream(fopen('http://httpbin.com/get', 'r'));
|
return true;
|
);
|
|
$response = $client->send();
|