2013-06-10 47 views
5

Tôi hiện đang sử dụng cURL để thử và nhận URL từ chuyển hướng cho trình thu thập dữ liệu trang web. Tôi chỉ cần url từ trang web. Tôi đã nghiên cứu về stackoverflow và các trang web khác trong vài ngày qua và đã không thành công. Mã tôi hiện đang sử dụng là từ trang web này:cURL nhận url từ chuyển hướng

$url = "http://www.someredirect.com"; 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 
    $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'; 

Bất kỳ trợ giúp nào sẽ được đánh giá cao!

+1

'preg_match_all ('/^Vị trí: (. *) $/Mi', $ response, $ match);', bạn đang cố gắng khớp 'header ('Location: http: //google.com'); 'ví dụ? :/ – Prisoner

+0

Vâng. Đang cố gắng phân tích cú pháp Vị trí từ tiêu đề, nhưng thẻ vị trí không được trả lại trong tiêu đề. – Josh

+0

Trong trường hợp đó, mã của bạn hoạt động tốt cho tôi. – Prisoner

Trả lời

4

Hãy thử sử dụng mã này:

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; 

}

7

Trong trường hợp cụ thể của bạn, máy chủ đang kiểm tra cho chuỗi user-agent nào đó.

Khi máy chủ kiểm tra chuỗi tác nhân người dùng, máy chủ sẽ chỉ phản hồi bằng mã trạng thái chuyển hướng 302 khi máy chủ nhìn thấy tác nhân người dùng "hợp lệ" (theo máy chủ). Bất kỳ tác nhân người dùng "không hợp lệ" nào sẽ không nhận được phản hồi mã trạng thái chuyển hướng 302 hoặc tiêu đề Location:.

Trong trường hợp cụ thể của bạn, khi máy chủ nhận được yêu cầu từ tác nhân người dùng "không hợp lệ", nó phản hồi với mã trạng thái OK 200 không có văn bản trong nội dung phản hồi.

(Note: trong các mã dưới đây, các URL thực tế cung cấp đã được thay thế bằng các ví dụ.)

Hãy nói rằng máy chủ http://www.example.com 's kiểm tra chuỗi User-Agent và http://www.example.com/product/123/ chuyển hướng đến http://www.example.org/abc.

Trong PHP giải pháp của bạn sẽ là:

<?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'; 

Và, đầu ra của kịch bản này sẽ là: http://www.example.org/abc.

+0

URL đó trả lại mã trạng thái HTTP OK 200. – cmt

+0

Vâng tôi đã nhận ra điều đó, nên đã nói điều gì đó. Nếu nó không phải là một chuyển hướng kỹ thuật, nhưng vẫn chuyển hướng đến một trang web khác, làm thế nào tôi sẽ đi về lấy url tôi muốn? – Josh

+0

Trên dòng lệnh, bạn có thể xác minh các chuyển hướng của mình bằng cách sử dụng 'curl'. Ví dụ: 'curl -IL http: // microsoft.com' trước tiên sẽ cung cấp cho bạn mã trạng thái 301, sau đó là 200. Khi tôi nhập url bạn đã cung cấp cho tôi, tôi nhận được mã trạng thái 200 OK trên URL đầu tiên. – cmt

Các vấn đề liên quan