2009-09-17 16 views
31

HTTP स्थिति कोड 302 होने पर curl का उपयोग कर गंतव्य URL कैसे प्राप्त कर सकता हूं?मैं 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

आपके अन्य अनसुलझे प्रश्नों पर कोई भाग्य? – GZipp

+0

आपको सही उत्तर (-1) – John

उत्तर

5

आप रीडायरेक्ट URL के लिए स्थान हैडर हड़पने के लिए की है।

+1

स्वीकार करना चाहिए, जिसके लिए यह और अधिक परेशानी की आवश्यकता है, जैसे कि यह रिश्तेदार है या नहीं, इसे हल करने के लिए (संभवतः इंटरमीडिएट रीडायरेक्शन में पिछले बेस यूआरएल में यदि एकाधिक हैं तो पीपी।), यह और भी है उपयोग करने में आसान ['CURLINFO_EFFECTIVE_URL'] (http://stackoverflow.com/a/4917416/367456)। – hakre

2

http2 हेडर फ़ील्ड "स्थान" में स्थित 302 रीडायरेक्ट ist के लिए नया गंतव्य है। उदाहरण:

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 

बस एक regex के साथ यह grep।

सभी HTTP शीर्षलेख जानकारी शामिल करने के लिए इसे कर्ल विकल्प CURLOPT_HEADER के साथ परिणाम में शामिल किया गया है।

curl_setopt($c, CURLOPT_HEADER, true); 

आप बस का पालन करने के कर्ल चाहते हैं पुनर्निर्देशन CURLOPT_FOLLOWLOCATION का उपयोग करें:: के साथ यह सेट वैसे भी

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); 

, आप नए URI का प्रयोग नहीं करना चाहिए क्योंकि HTTP statusCode 302 केवल एक है अस्थायी पुनर्निर्देशित करें।

1

यहां सभी शीर्षलेख कर्ल http अनुरोध द्वारा लौटाए जाने के साथ-साथ स्टेटस कोड और प्रत्येक शीर्षलेख के लिए हेडर लाइनों की सरणी प्राप्त करने का एक तरीका है।

$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

उपयोग curl_getinfo($ch), और पहला तत्व (url) प्रभावी यूआरएल का संकेत होगा।

37

आप उपयोग कर सकते हैं:

$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); 

यह:

echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
+0

यह विधि स्थान क्लीनर से यूआरएल को पार्स करने के बाद बहुत साफ/सामान्य रूप से बेहतर है। –

+10

CURLINFO_EFFECTIVE_URL मेरे लिए वर्तमान (अनुरोधित) पृष्ठ लौटाता है। Curl_getinfo परिणामों में कोई रीडायरेक्ट नहीं है (स्थान :) url। ऐसा लगता है कि हेडर को पार्स करने का सबसे अच्छा अभ्यास है ... –

+0

'CURLINFO_EFFECTIVE_URL' हमेशा कुछ मामलों के लिए काम नहीं कर रहा है, खासतौर पर वे हेडर रीडायरेक्ट का उपयोग किए बिना। – 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

सही! – ladieu

+1

साझा करने के लिए धन्यवाद और यदि कोई स्थान शीर्षलेख नहीं है? –

+0

कभी-कभी साइट पेज रीडायरेक्ट करने के लिए मेटा रीडायरेक्ट या 'window.location.replace' का उपयोग करेगी। ऐसे मामले में, परिणाम कैप्चर करने के लिए नियमित अभिव्यक्ति को प्रतिस्थापित करें। – Raptor

5

एक प्रतिक्रिया की दिनांकित लेकिन थोड़ा एक पूर्ण काम कर उदाहरण दिखाना चाहते थे, समाधान के कुछ बाहर वहाँ टुकड़े कर रहे हैं किसी भी रीडायरेक्ट के साथ काम करता है जैसे कि 301 या 302, हालांकि 404 पर यह केवल मूल यूआरएल अनुरोध करेगा (क्योंकि यह नहीं मिला था)। इसका उपयोग आपकी साइट से लिंक अपडेट या निकालने के लिए किया जा सकता है। वैसे भी यह मेरी ज़रूरत थी।

2

Tamik Soziev के जवाब पर user437797 की टिप्पणी के जवाब में (मैं दुर्भाग्य से सीधे टिप्पणी करने के लिए प्रतिष्ठा की जरूरत नहीं है):

CURLINFO_EFFECTIVE_URL, ठीक काम करता है, लेकिन यह सेशन के रूप में करने के लिए आप भी CURLOPT_FOLLOWLOCATION सेट करने के लिए चाहता है निश्चित रूप से सही करने के लिए। ऐसा इसलिए है क्योंकि CURLINFO_EFFECTIVE_URL ठीक वही देता है जो यह कहता है, प्रभावी यूआरएल जो लोड होने से समाप्त होता है। यदि आप रीडायरेक्ट का पालन नहीं करते हैं तो यह आपका अनुरोध किया गया यूआरएल होगा, अगर आप रीडायरेक्ट का पालन करते हैं तो यह अंतिम यूआरएल होगा जिसे रीडायरेक्ट किया गया है।

इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह एकाधिक रीडायरेक्ट के साथ भी काम करता है, जबकि HTTP शीर्षलेख को पुनर्प्राप्त करने और पार्स करने पर आपको अंतिम गंतव्य यूआरएल का खुलासा करने से पहले कई बार ऐसा करना पड़ सकता है।

यह भी ध्यान रखें कि निम्नानुसार रीडायरेक्ट की अधिकतम संख्या CURLOPT_MAXREDIRS के माध्यम से नियंत्रित की जा सकती है।डिफ़ॉल्ट रूप से यह असीमित (-1) है लेकिन अगर आपको कुछ यूआरएल (शायद जानबूझकर) कॉन्फ़िगर किया गया है और कुछ यूआरएल के लिए अंतहीन रीडायरेक्ट लूप है तो यह आपको परेशानी में डाल सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे