cURL get url from redirect
In your particular case, the server is checking for certain user-agent strings.
When a server checks the user-agent string, it will only respond with a 302
redirect status code when the server sees a "valid" (according to the server) user-agent. Any "invalid" user-agents will not receive the 302
redirect status code response or Location:
header.
In your particular case, when the server receives a request from an "invalid" user-agent it responds with a 200
OK status code with no text in the response body.
(Note: in the code below, the actual URLs provided have been replaced with examples.)
Let's say that http://www.example.com
's server checks the User-Agent string and that http://www.example.com/product/123/
redirects to http://www.example.org/abc
.
In PHP your solution would be:
<?php$url = 'http://www.example.com/product/123/';$ch = curl_init($url);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HEADER, true);curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0"); // Necessary. The server checks for a valid User-Agent.curl_exec($ch);$response = curl_exec($ch);preg_match_all('/^Location:(.*)$/mi', $response, $matches);curl_close($ch);echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found';
And, the output of this script would be: http://www.example.org/abc
.
Try using this code:
function curl_last_url(/*resource*/ $ch, /*int*/ &$maxredirect = null) { $mr = $maxredirect === null ? 5 : intval($maxredirect); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); if ($mr > 0) { echo $mr; echo $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $rch = curl_copy_handle($ch); curl_setopt($rch, CURLOPT_HEADER, true); curl_setopt($rch, CURLOPT_NOBODY, true); curl_setopt($rch, CURLOPT_FORBID_REUSE, false); curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); do { curl_setopt($rch, CURLOPT_URL, $newurl); $header = curl_exec($rch); if (curl_errno($rch)) { $code = 0; } else { $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); echo $code; if ($code == 301 || $code == 302) { preg_match('/Location:(.*?)\n/', $header, $matches); $newurl = trim(array_pop($matches)); } else { $code = 0; } } } while ($code && --$mr); curl_close($rch); if (!$mr) { if ($maxredirect === null) { trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); } else { $maxredirect = 0; } return false; } curl_setopt($ch, CURLOPT_URL, $newurl); } return $newurl;
}