當我們使用 PHP 中的 cURL 函數時,有時會遇到需要跟隨重定向的情況。在不做特殊處理的情況下,cURL 函數默認不會自動跳轉到重定向后的新 URL,而是返回重定向前的原始 URL。
舉個例子,假設我們向一個網站發送 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 所對應的頁面內容。但是如果這個網站進行了重定向,比如將 http://example.com 重定向到 http://www.example.com,那么 cURL 函數默認會返回的依然是 http://example.com 的內容,而不是 http://www.example.com 。
為了讓 cURL 函數自動跟隨重定向,我們需要在請求選項中設置 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;
現在,如果我們向重定向過的網站發送 GET 請求,cURL 函數會自動跳轉到新的 URL 并返回對應頁面的內容。
需要注意的是,如果目標網站進行了過多的重定向,cURL 函數默認只會跟隨前面幾次重定向。如果希望完全跟隨所有重定向,可以將 CURLOPT_MAXREDIRS 選項設為 -1。
在實際使用中,我們會發現,有一些網站進行了特殊的重定向處理,比如采用了 JavaScript 重定向或者基于 Cookie 的跳轉。針對這些情況,我們可以考慮使用 CURLINFO_REDIRECT_URL 選項獲取重定向后的新 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,并不斷重試訪問,直到達到最大重試次數或者跳轉到最終的目標頁面為止。
總之,使用 cURL 函數進行跳轉需要注意 CURLOPT_FOLLOWLOCATION 和 CURLOPT_MAXREDIRS 選項的設置,并且針對一些特殊情況需要特殊處理。