當(dāng)我們使用 PHP 中的 cURL 函數(shù)時,有時會遇到需要跟隨重定向的情況。在不做特殊處理的情況下,cURL 函數(shù)默認(rèn)不會自動跳轉(zhuǎn)到重定向后的新 URL,而是返回重定向前的原始 URL。
舉個例子,假設(shè)我們向一個網(wǎng)站發(fā)送 GET 請求:
$url = 'http://example.com'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); curl_close($ch); echo $result;
通常情況下,這個請求會返回 http://example.com 所對應(yīng)的頁面內(nèi)容。但是如果這個網(wǎng)站進(jìn)行了重定向,比如將 http://example.com 重定向到 http://www.example.com,那么 cURL 函數(shù)默認(rèn)會返回的依然是 http://example.com 的內(nèi)容,而不是 http://www.example.com 。
為了讓 cURL 函數(shù)自動跟隨重定向,我們需要在請求選項(xiàng)中設(shè)置 CURLOPT_FOLLOWLOCATION 的值為 true。修改上面的代碼:
$url = 'http://example.com'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $result = curl_exec($ch); curl_close($ch); echo $result;
現(xiàn)在,如果我們向重定向過的網(wǎng)站發(fā)送 GET 請求,cURL 函數(shù)會自動跳轉(zhuǎn)到新的 URL 并返回對應(yīng)頁面的內(nèi)容。
需要注意的是,如果目標(biāo)網(wǎng)站進(jìn)行了過多的重定向,cURL 函數(shù)默認(rèn)只會跟隨前面幾次重定向。如果希望完全跟隨所有重定向,可以將 CURLOPT_MAXREDIRS 選項(xiàng)設(shè)為 -1。
在實(shí)際使用中,我們會發(fā)現(xiàn),有一些網(wǎng)站進(jìn)行了特殊的重定向處理,比如采用了 JavaScript 重定向或者基于 Cookie 的跳轉(zhuǎn)。針對這些情況,我們可以考慮使用 CURLINFO_REDIRECT_URL 選項(xiàng)獲取重定向后的新 URL。
$url = 'http://example.com'; $max_retries = 5; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, -1); $result = curl_exec($ch); $redirect_count = 0; while (curl_errno($ch) == 47 && $redirect_count< $max_retries) { $url = curl_getinfo($ch, CURLINFO_REDIRECT_URL); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); $redirect_count++; } curl_close($ch); echo $result;
上面的代碼示例通過 CURLINFO_REDIRECT_URL 獲取重定向后的新 URL,并不斷重試訪問,直到達(dá)到最大重試次數(shù)或者跳轉(zhuǎn)到最終的目標(biāo)頁面為止。
總之,使用 cURL 函數(shù)進(jìn)行跳轉(zhuǎn)需要注意 CURLOPT_FOLLOWLOCATION 和 CURLOPT_MAXREDIRS 選項(xiàng)的設(shè)置,并且針對一些特殊情況需要特殊處理。