2010-10-31 48 views
24

Tôi hiện đang sử dụng curl để điền vào biểu mẫu, nhưng sau khi hoàn thành bài đăng, tập lệnh khác xử lý biểu mẫu đang chuyển hướng đến url khác, bây giờ tôi muốn nhận url, mà tập lệnh đang chuyển hướng đến một biến.cURL, nhận url chuyển hướng tới biến số

Cảm ơn ..

+0

Bản sao có thể có của [Làm cách nào để nhận URL đích bằng cách sử dụng cURL?] (http://stackoverflow.com/questions/1439040/how-can-i-get-the- url-url-using-curl) –

Trả lời

32

Bạn sẽ sử dụng

curl_setopt($CURL, CURLOPT_HEADER, TRUE); 

Và phân tích các tiêu đề cho location tiêu đề

+0

+1 bị mất điểm đó :) – Sarfraz

+0

Không vấn đề gì, sử dụng các trường đăng sẽ gửi dữ liệu và sau đó máy chủ sẽ chuyển hướng và khi dữ liệu được xuất ra dưới dạng phản hồi, cuộn tròn sẽ chọn nó lên để tiêu đề vị trí nên ở đó. – RobertPitt

3

Bạn có thể muốn thiết lập các CURLOPT_FOLLOWLOCATION là true.

Hoặc đặt CURLOPT_HEADER thành true và sau đó sử dụng regexp để lấy tiêu đề Vị trí.

+0

Cũng lưu ý chế độ an toàn php với điều này, http://www.php.net/manual/en/function.curl-setopt.php#95027 – RobertPitt

8

Ở đây tôi nhận được tiêu đề tài nguyên http sau đó tôi phân tích cú pháp tiêu đề thành một mảng $ retVal. Tôi đã nhận mã cho phân tích các tiêu đề từ đây (http://www.bhootnath.in/blog/2010/10/parse-http-headers-in-php/) Bạn cũng có thể sử dụng http://php.net/manual/en/function.http-parse-headers.php nếu bạn có (PECL pecl_http> = 0.10.0)

 $ch = curl_init(); 
     $timeout = 0; 
     curl_setopt ($ch, CURLOPT_URL, $url); 
     curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
     curl_setopt($ch, CURLOPT_HEADER, TRUE); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
     // Getting binary data 
     $header = curl_exec($ch); 
     $retVal = array(); 
     $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header)); 
     foreach($fields as $field) { 
      if(preg_match('/([^:]+): (.+)/m', $field, $match)) { 
       $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1]))); 
       if(isset($retVal[$match[1]])) { 
        $retVal[$match[1]] = array($retVal[$match[1]], $match[2]); 
       } else { 
        $retVal[$match[1]] = trim($match[2]); 
       } 
      } 
     } 
//here is the header info parsed out 
echo '<pre>'; 
print_r($retVal); 
echo '</pre>'; 
//here is the redirect 
if (isset($retVal['Location'])){ 
    echo $retVal['Location']; 
} else { 
    //keep in mind that if it is a direct link to the image the location header will be missing 
    echo $_GET[$urlKey]; 
} 
curl_close($ch); 
+0

Tôi đã thử mã phân tích cú pháp này và nó không hoạt động, tôi đã ném một số lỗi trên "bùng nổ()" phần lại: để chuyển đổi một mảng thành một chuỗi – bitwit

+0

@ nico-limpika Cảm ơn rất nhiều :-) Mã của bạn đã giúp tôi rất nhiều. – ravisoni

+0

trong 'preg_replace' **'/e modifier không được chấp nhận' ** ai có thể cập nhật câu trả lời này không? –

34

Cách dễ dàng để tìm thấy url chuyển hướng (nếu bạn không muốn biết trước)

$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
+3

Đó là 'CURLINFO_REDIRECT_URL' – Sparky

+0

Tôi không tìm thấy CURLINFO_REDIRECT_URL tại đây http: // www.php.net/manual/en/function.curl-getinfo.php –

+1

Nhưng tôi tìm thấy nó ở đây http://php.net/ChangeLog-5.php !!! CURLINFO_REDIRECT_URL được thêm vào 5.3.7 - nhưng không được ghi lại. Nhưng từ nguồn tôi giả định rằng đây là (đầu tiên) giá trị url chuyển hướng trong trường hợp cuộc gọi curl không sử dụng chuyển hướng tự động. Vì vậy, chúng tôi sẽ biết url tiếp theo là gì trong trường hợp chúng tôi đã bật chuyển hướng. Cảm ơn bạn @Sparky vì đã buộc tôi đào. –

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