How can I find where I will be redirected using cURL in PHP?
To make cURL follow a redirect, use:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
Erm... I don't think you're actually executing the curl... Try:
curl_exec($ch);
...after setting the options, and before the curl_getinfo()
call.
EDIT: If you just want to find out where a page redirects to, I'd use the advice here, and just use Curl to grab the headers and extract the Location: header from them:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if (preg_match('~Location: (.*)~i', $result, $match)) {
$location = trim($match[1]);
}
Get cURL to follow redirects
curl
has an option to achieve exactly what you are looking for,
following redirects:
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
Just add this line to your curl-options before your execution of it.
As you might expect, this will follow any 301 / 302 redirects and ends up on a site, which doesn't redirect your request any further.
Also, remember that (without having a workaround) this might lead to an infinite loop. (site a redirects to b and b redirects to a).
That said, you should use this option as well:
curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
This way, your requests will end after 10 redirects and you don't have to bother with your script running in an endless-loop.
A good source for your further work with diffrent options is the regarding site on php.net
PHP Curl following redirects
http.//php.net/manual/en/ref.curl.php
function get_final_url( $url, $timeout = 5 )
{
$url = str_replace( "&", "&", urldecode(trim($url)) );
$cookie = tempnam ("/tmp", "CURLCOOKIE");
$ch = curl_init();
curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_ENCODING, "" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
curl_close ( $ch );
if ($response['http_code'] == 301 || $response['http_code'] == 302)
{
ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");
$headers = get_headers($response['url']);
$location = "";
foreach( $headers as $value )
{
if ( substr( strtolower($value), 0, 9 ) == "location:" )
return get_final_url( trim( substr( $value, 9, strlen($value) ) ) );
}
}
if ( preg_match("/window\.location\.replace\('(.*)'\)/i", $content, $value) ||
preg_match("/window\.location\=\"(.*)\"/i", $content, $value)
)
{
return get_final_url ( $value[1] );
}
else
{
return $response['url'];
}
}
php with Curl: follow redirect with POST
curl is following what RFC 7231 suggests, which also is what browsers typically do for 301 responses:
Note: For historical reasons, a user agent MAY change the request
method from POST to GET for the subsequent request. If this
behavior is undesired, the 307 (Temporary Redirect) status code
can be used instead.
If you think that's undesirable, you can change it with the CURLOPT_POSTREDIR
option, which only seems very sparsely documented in PHP but the libcurl docs explains it. By setting the correct bitmask there, you then make curl not change method when it follows the redirect.
If you control the server end for this, an easier fix would be to make sure a 307 response code is returned instead of a 301.
Is there a way to follow redirects with command line cURL?
Use the location header flag:
curl -L <URL>
follow redirects with curl in php
cURL will not follow JS or meta tag redirects.
PHP: cURL and keep track of all redirections
You have
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
This means that cURL will follow redirects and return you only the final page with no Location header.
To follow location manually:
function getWebPage($url, $redirectcallback = null){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0");
$html = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302) {
list($httpheader) = explode("\r\n\r\n", $html, 2);
$matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $httpheader, $matches);
$nurl = trim(array_pop($matches));
$url_parsed = parse_url($nurl);
if (isset($url_parsed)) {
if($redirectcallback){ // callback
$redirectcallback($nurl, $url);
}
$html = getWebPage($nurl, $redirectcallback);
}
}
return $html;
}
function trackAllLocations($newUrl, $currentUrl){
echo $currentUrl.' ---> '.$newUrl."\r\n";
}
getWebPage('some url with redirects', 'trackAllLocations');
Related Topics
Where to Use MySQL_Real_Escape_String to Prevent SQL Injection
Why Does PHP's Call_User_Func() Function Not Support Passing by Reference
Passing and Parse Paypal Ipn Custom Field
Php: How to Add Leading Zeros/Zero Padding to Float via Sprintf()
What Does "->" Mean/Refer to in PHP
Sharing PHP Session ($_Session) Across Multiple Domain
How to Format a PHP Include() Absolute (Rather Than Relative) Path
Get Specific Device Information
Mysqli Query to Loop Through Array and Update Multiple Rows
Google Recaptcha - Keep Getting 'Incorrect-Captcha-Sol'
$_Server['Remote_Addr'] Not Giving the Right Ip Address
PHP Remove/Fix Module Not Found or Already Loaded Warnings
How to Execute MySQL Script with Variables Using PHP::Pdo