1

I have some address (for example: http://example.com/b-out/3456/3212/).This address i must pass through curl. I know that this URL redirects to another URL (like http://sdss.co/go/36a7fe71189fec14c85636f33501f6d2/?...). And this another URL located in the headers (Location) of first URL. How can I get second URL in some variable?

Aleksander
  • 15
  • 3
  • Disallow curl to automatically follow redirects; let it just make this one request, and parse the returned headers. – deceze Sep 16 '14 at 08:41
  • You have to give us a real URL to work with, there are several ways to redirect. And what have you tried yourself? – KIKO Software Sep 16 '14 at 08:43

2 Answers2

1

Perform a request to the first URL, confirm a redirect takes place and read the Location header. From PHP cURL retrieving response headers AND body in a single request? and Check headers in PHP cURL server response:

$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $url);
curl_setopt($curlHandle, CURLOPT_HEADER, 1);
curl_setopt($curlHandle, CURLOPT_NOBODY, 1);
curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);

$redirectResponse = curl_exec($curlHandle);

The options being set there mean: return the response headers, don't return the response body, don't automatically follow redirects and return the result in the exec-call.

Now you've got the HTTP response headers, without body, in $redirectResponse. You'll now need to verify that it's a redirect:

$statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
if ($statusCode == 301 || $statusCode == 302 || $statusCode == 303)
{
    $headerLength = curl_getinfo($curlHandle, CURLINFO_HEADER_SIZE);
    $responseHeaders = substr($redirectResponse, 0, $headerLength);
    $redirectUrl = getLocationHeader($responseHeaders);
}

Then create a function to do that:

function getLocationHeader($responseHeaders)
{

}

In there you'll want to explode() the $responseHeaders on HTTP newline (\r\n) and find the header starting with location.


Alternatively, you can use a more abstract HTTP client library like Zend_Http_Client, where it is a little easier to obtain the headers.

Community
  • 1
  • 1
CodeCaster
  • 147,647
  • 23
  • 218
  • 272
0

I did it like CodeCaster said. This is my function 'getLocationHeader': function getLocationHeader($responseHeaders) { if (preg_match('/Location:(.+)Vary/is', $redirectResponse, $loc)) { $location = trim($loc[1]); return $location; } return FALSE; }

Aleksander
  • 15
  • 3