2009-09-17 28 views
31

Tôi làm cách nào để có được URL đích bằng cách sử dụng cURL khi mã trạng thái HTTP là 302?Tôi làm cách nào để có được URL đích bằng cách sử dụng cURL?

<?PHP 
$url = "http://www.ecs.soton.ac.uk/news/"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$html = curl_exec($ch); 
$status_code = curl_getinfo($ch,CURLINFO_HTTP_CODE); 

if($status_code=302 or $status_code=301){ 
    $url = ""; 
    // I want to to get the destination url 
} 
curl_close($ch); 
?> 
+2

Bất kỳ may mắn nào về các câu hỏi chưa được giải quyết khác của bạn? – GZipp

+0

bạn nên chấp nhận câu trả lời đúng (-1) – John

Trả lời

5

Bạn phải lấy Location tiêu đề cho URL được chuyển hướng.

+1

Cần phức tạp hơn nữa, như kiểm tra xem nó có tương đối hay không, giải quyết nó (có thể là URL cơ bản trước đó trong chuyển hướng trung gian nếu có nhiều trang vv). dễ sử dụng ['CURLINFO_EFFECTIVE_URL'] (http://stackoverflow.com/a/4917416/367456). – hakre

2

Điểm đến mới cho chuyển hướng 302 ist nằm trong trường tiêu đề http "vị trí". Ví dụ:

HTTP/1.1 302 Found 
Date: Tue, 30 Jun 2002 1:20:30 GMT 
Server: Apache 
Location: http://www.foobar.com/foo/bar 
Content-Type: text/html; charset=iso-8859-1 

Chỉ cần grep bằng regex.

Để bao gồm tất cả thông tin tiêu đề HTTP, hãy đưa nó vào kết quả với tùy chọn curl CURLOPT_HEADER. Đặt nó với:

curl_setopt($c, CURLOPT_HEADER, true); 

Nếu bạn chỉ muốn curl để làm theo các chuyển hướng sử dụng CURLOPT_FOLLOWLOCATION:

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); 

Dù sao, bạn không nên sử dụng URI mới vì HTTP statusCode 302 chỉ là một tạm thời chuyển hướng.

1

Đây là cách để nhận tất cả tiêu đề được trả về bởi yêu cầu http curl, cũng như mã trạng thái và một mảng dòng tiêu đề cho mỗi tiêu đề.

$url = 'http://google.com'; 
$opts = array(CURLOPT_URL => $url, 
       CURLOPT_RETURNTRANSFER => true, 
       CURLOPT_HEADER => true, 
       CURLOPT_FOLLOWLOCATION => true); 

$ch = curl_init(); 
curl_setopt_array($ch, $opts); 
$return = curl_exec($ch); 
curl_close($ch); 

$headers = http_response_headers($return); 
foreach ($headers as $header) { 
    $str = http_response_code($header); 
    $hdr_arr = http_response_header_lines($header); 
    if (isset($hdr_arr['Location'])) { 
     $str .= ' - Location: ' . $hdr_arr['Location']; 
    } 
    echo $str . '<br />'; 
} 

function http_response_headers($ret_str) 
{ 
    $hdrs = array(); 
    $arr = explode("\r\n\r\n", $ret_str); 
    foreach ($arr as $each) { 
     if (substr($each, 0, 4) == 'HTTP') { 
      $hdrs[] = $each; 
     } 
    } 
    return $hdrs; 
} 

function http_response_header_lines($hdr_str) 
{ 
    $lines = explode("\n", $hdr_str); 
    $hdr_arr['status_line'] = trim(array_shift($lines)); 
    foreach ($lines as $line) { 
     list($key, $val) = explode(':', $line, 2); 
     $hdr_arr[trim($key)] = trim($val); 
    } 
    return $hdr_arr; 
} 

function http_response_code($str) 
{ 
    return substr(trim(strstr($str, ' ')), 0, 3); 
} 
0

Sử dụng curl_getinfo($ch) và phần tử đầu tiên (url) sẽ cho biết URL hiệu dụng.

37

Bạn có thể sử dụng:

echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
+0

Phương pháp này sạch hơn rất nhiều/thường tốt hơn sau đó phân tích url khỏi tiêu đề Vị trí. –

+10

CURLINFO_EFFECTIVE_URL trả lại trang hiện tại (yêu cầu) cho tôi. Không có chuyển hướng (Location :) url trong kết quả curl_getinfo. Dường như, để phân tích tiêu đề là cách thực hành tốt nhất ... –

+0

'CURLINFO_EFFECTIVE_URL' không phải lúc nào cũng hoạt động đối với một số trường hợp, đặc biệt là những trường hợp không sử dụng chuyển hướng tiêu đề. – Raptor

21
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); // We'll parse redirect url from header. 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); // We want to just get redirect url but not to follow it. 
$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'; 
+0

hoàn hảo! Cảm ơn bạn đã chia sẻ – ladieu

+1

Và nếu không có tiêu đề vị trí? –

+0

Đôi khi các trang web sẽ sử dụng chuyển hướng meta hoặc 'window.location.replace' để chuyển hướng trang. Trong trường hợp này, thay thế biểu thức chính quy để nắm bắt kết quả. – Raptor

5

Một chút ngày của một phản ứng nhưng muốn thể hiện một ví dụ làm việc đầy đủ, một số các giải pháp hiện có là những mẩu:

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); //set url 
    curl_setopt($ch, CURLOPT_HEADER, true); //get header 
    curl_setopt($ch, CURLOPT_NOBODY, true); //do not include response body 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //do not show in browser the response 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //follow any redirects 
    curl_exec($ch); 
    $new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); //extract the url from the header response 
    curl_close($ch); 

này hoạt động với bất kỳ chuyển hướng nào như 301 hoặc 302, tuy nhiên trên 404, nó sẽ chỉ trả lại url ban đầu được yêu cầu (vì nó không được tìm thấy). Điều này có thể được sử dụng để cập nhật hoặc xóa liên kết khỏi trang web của bạn. Đây là nhu cầu của tôi.

2

Đáp lại bình luận user437797 về câu trả lời Tamik Soziev của (Tôi tiếc là không có uy tín để bình luận có trực tiếp):

Các CURLINFO_EFFECTIVE_URL hoạt động tốt, nhưng đối với nó để làm như op muốn bạn cũng phải thiết lập CURLOPT_FOLLOWLOCATION để TRUE tất nhiên. Điều này là do CURLINFO_EFFECTIVE_URL trả về chính xác những gì nó nói, url hiệu quả kết thúc bằng việc tải. Nếu bạn không theo dõi chuyển hướng thì đây sẽ là url được yêu cầu của bạn, nếu bạn thực hiện theo chuyển hướng thì đó sẽ là url cuối cùng được chuyển hướng đến.

Điều tốt đẹp về cách tiếp cận này là nó cũng hoạt động với nhiều chuyển hướng, trong khi khi tự truy xuất và phân tích cú pháp tiêu đề HTTP, bạn có thể phải làm điều đó nhiều lần trước khi url đích cuối cùng được hiển thị.

Cũng lưu ý rằng số lượng chuyển hướng tối đa uốn cong sau có thể được kiểm soát qua CURLOPT_MAXREDIRS.Theo mặc định nó là không giới hạn (-1) nhưng điều này có thể giúp bạn gặp rắc rối nếu một ai đó (có thể cố ý) cấu hình và vòng lặp chuyển hướng vô tận cho một số url.

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