0

我使用cURL來繞過重定向(301,302)和特殊的URL,如adf.ly等。我有一個工作的代碼,但我無法修復這一特定問題:cURL返回一個相對的「Location:」url,如何獲取完整的URL?

當我使用cURL跟隨location參數,在一些網站上,最後重定向可以在其Location:結果相對URL。

爲了說清楚,我在自己的網站上添加了這樣的重定向。我正在使用

header("Location: /maintenance"); exit(); 

在我的PHP代碼中爲了演示它。我做了這個快速捲曲要求:

$url = "http://deci.deals/post/99/comment/427"; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_FAILONERROR, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1712.4 Safari/537.36'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
$data = curl_exec($ch); 
curl_close($ch); 

echo("<br/>CURRENT_URL: ".$url); 

if (preg_match_all('/Location:\s*(.+)\s*$/im', $data, $matches, PREG_SET_ORDER)) { 
    $last = array_pop($matches); 
    echo "<br/>FOUND: ".$last[1]; 
} 

輸出:

CURRENT_URL: http://deci.deals/post/99/comment/427 
FOUND: /maintenance 

正如你所看到的,Location值是相對URL。有什麼辦法可以獲得絕對的URL而不是這個嗎?

謝謝!

+1

echo curl_getinfo($ ch,CURLINFO_EFFECTIVE_URL); – Robot70

+0

@ Robot70謝謝!信任這個URL而不是'Location'結果是否安全? –

+0

我不知道。這取決於你。 – Robot70

回答

0

this維基百科頁面:

相對URL是不包括方案或主機URL。在要求瞭解的 中,必須將其與原始請求的網址合併。對於http://www.example.com/blog

客戶端請求:

GET /blog HTTP/1.1 
Host: www.example.com 

服務器響應:

HTTP/1.1 302 Found 
Location: /articles/ 

位置的URL是由客戶端擴展到

http://www.example.com/articles/ 
+0

我在考慮連接它們,但我認爲'CURLOPT_FOLLOWLOCATION'可能會「跳過」重定向,然後我不可能依靠原始URL,如果我錯了,請糾正我 –