Aleksander
Aleksander

Reputation: 15

How can I get HTTP headers (Location) from some URL?

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?

Upvotes: 1

Views: 800

Answers (2)

Aleksander
Aleksander

Reputation: 15

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; }

Upvotes: 0

CodeCaster
CodeCaster

Reputation: 151604

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.

Upvotes: 1

Related Questions