2011-12-01 12 views
13

लिंक शॉर्टनर्स और अजाक्स के दिनों में, कई लिंक हो सकते हैं जो आखिरकार एक ही सामग्री को इंगित करते हैं। मैं सोच रहा था कि PHP में एक वेब साइट के लिए अंतिम, सर्वोत्तम लिंक प्राप्त करने का सबसे अच्छा तरीका क्या है, उम्मीद है कि लाइब्रेरी के साथ। मैं Google या गिटहब पर कुछ भी ढूंढने में असमर्थ था।PHP का उपयोग कर वेबसाइट के अंतिम, पुनर्निर्देशित, कैनोलिक यूआरएल को मैं कैसे प्राप्त करूं?

मैं इस उदाहरण कोड को देखा है, लेकिन यह एक rel जैसी चीजों को संभाल नहीं करता है = "प्रामाणिक" मेटा टैग या डिफ़ॉल्ट SSL पोर्ट: http://w-shadow.com/blog/2008/07/05/how-to-get-redirect-url-in-php/

फेसबुक बहुत अच्छी तरह से इस संभाल करने के लिए लगता है, आप देख सकते हैं कि वे किस तरह 301 के का पालन करें और rel = "प्रामाणिक", आदि रास्ता फेसबुक यह संभालती के उदाहरण देखने के लिए, उनके ओपन ग्राफ़ उपकरण का उपयोग करने के लिए:

https://developers.facebook.com/tools/debug

और इन कड़ियों दर्ज करें:

http: // dlvr .it/xxb0W
https://twitter.com/#!/twitter/statuses/136946408275193856

वहाँ एक PHP पुस्तकालय पहले से ही है कि इस पहले से बने, जहां यह इन हेडर के लिए जाँच करेगा, हल है 301 रीडायरेक्ट्स, पार्स रिले = "कैनोनिकल", रीडायरेक्ट लूप का पता लगाएं और ठीक से उपयोग करने के लिए सबसे अच्छा परिणामस्वरूप यूआरएल पकड़ लें?

एक विकल्प के रूप में, मैं एपीआई के लिए खुला हूं जिसका उपयोग किया जा सकता है, लेकिन कुछ ऐसा पसंद करेगा जो मेरे अपने सर्वर पर चलता है।

+0

इस चेक, http://stackoverflow.com/questions/4454605/follow-redirects-with-curl -in-php – Srisa

+0

मुझे नहीं पता कि मैं आपका प्रश्न समझता हूं, लेकिन मुझे लगता है कि आपको यह http://php.net/manual/es/reserved.variables.server.php – NotGaeL

+0

धन्यवाद श्रीसा, सामान्य है विचार, लेकिन कर्ल स्वीकार्य उत्तर नोट्स के रूप में मेटा टैग रीडायरेक्ट का पालन नहीं करता है ... समाधान को अंतिम रीडायरेक्ट लिंक के लिए HTML के कुछ पार्सिंग की आवश्यकता होगी, और फिर लूप स्थित होने तक संभावित रूप से अधिक रीडायरेक्ट हो जाएंगे या हम पहुंचेंगे पुनर्निर्देशन और rel = "canonical" श्रृंखला का अंत ... जू था उम्मीद है कि किसी ने पहले से ही यह लिखा है इसलिए मुझे नहीं करना है। :) – Matt

उत्तर

0

मैंने आपको ऐसा करने के लिए थोड़ा सा कार्य लिखा था। यह आसान है, लेकिन यह आपके लिए एक शुरुआती बिंदु हो सकता है। नोट: http://dlvr.it/xxb0W url इसके स्थान प्रतिक्रिया शीर्षलेख के लिए एक अवैध URL देता है।

आपको काम करने के लिए Altumo PHP लाइब्रेरी की आवश्यकता होगी। यह एक पुस्तकालय है जिसे मैंने लिखा है, लेकिन यह एमआईटी लाइसेंस है, जैसा कि यह कार्य है।

देखें: https://github.com/homer6/altumo

इसके अलावा, आप आज़माएं/कैच में समारोह रैप करने के लिए होगा।

/** 
* Gets the final URL of a URL that will be redirected. 
* 
* @param string $url_string 
* @throws \Exception     //on error 
* @return string 
*/ 
function get_final_url($url_string){ 

    while(1){ 

     //validate URL 
      $url = new \Altumo\String\Url($url_string); 

     //get the Location response header of the URL 
      $client = new \Altumo\Http\OutgoingHttpRequest($url_string); 
      $response = $client->sendAndGetResponseMessage(); 
      $location = $response->getHeader('Location'); 

     //return the URL if no Location header was found, else continue 
      if(is_null($location)){ 
       return $url_string; 
      }else{ 
       $url_string = $location; 
      } 

    } 

} 

echo get_final_url('your url here'); 

कृपया मुझे बताएं कि क्या आप और संशोधन करना चाहते हैं या इसे प्राप्त करने में सहायता करना चाहते हैं।

+0

धन्यवाद होमर - मैं प्रयास की सराहना करता हूं। चूंकि मुझे कोई लाइब्रेरी सुझाव नहीं मिल रहा है, इसलिए मैंने अपना खुद का लेखन शुरू करने का फैसला किया है और अगले कुछ दिनों में जब इसे किया जाता है तो मैं इसे यहां पोस्ट करूंगा (और गीथूब पर) ... मैं वास्तव में कुछ और अधिक उन्नत खोज रहा हूं निम्नलिखित * बस * स्थान हेडर रीडायरेक्ट करता है। मैं इसे पृष्ठ के को कैनोलिक और खुले ग्राफ यूआरएल प्राप्त करने के लिए पार्स करना चाहता हूं, उन का पालन करें, आदि। लाइब्रेरी अब तक कोड की लगभग 500 लाइनों तक है, लेकिन यह मेरी इच्छा के अनुसार काम करने के करीब है। :) – Matt

+0

अच्छा मैट लगता है ... आपके पास क्या देखने के लिए उत्सुक है। चीयर्स। – Homer6

12

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

https://github.com/mattwright/URLResolver.php

URLResolver।

  • अनुसरण करता है 301 और 302 HTTP हेडर में पाया रीडायरेक्ट
  • अनुसरण करता ओपन ग्राफ़ यूआरएल < मेटा > वेब पेज < सिर में पाया टैग: php एक PHP वर्ग है कि एक अंतिम, विहित लिंक करने के लिए यूआरएल को हल करने का प्रयास करता है >
  • विहित यूआरएल का पालन करता < लिंक > टैग वेब पेज में पाया < सिर >
  • रोकता डाउनलोड qu अगर सामग्री प्रकार एक HTML पृष्ठ नहीं है

मैं निश्चित रूप से HTTP पुनर्निर्देशन के नियमों पर एक विशेषज्ञ नहीं हूं, इसलिए अगर किसी के पास इस पुस्तकालय को सुधारने के सुझाव हैं, तो इसकी सराहना की जाएगी। मैंने हजारों यूआरएल में परीक्षण किया है और ऐसा लगता है कि यह बहुत अच्छा है। मैंने मारियो की सलाह का पालन किया और जहां आवश्यक हो वहां PHP सरल HTML पार्सर लाइब्रेरी का उपयोग किया।

+2

नरक आदमी के रूप में उपयोगी, धन्यवाद –

+0

यह वास्तव में अच्छी तरह से काम करता है। –

2

guzzle (एक अच्छी तरह से जाना जाता है और मजबूत HTTP क्लाइंट) आप ऐसा कर सकते हैं का उपयोग करना:

<?php 
use Guzzle\Http\Client as GuzzleClient; 
use Guzzle\Plugin\History\HistoryPlugin; 

public function resolveUrl($url) 
{ 
    $client = new GuzzleClient($url); 
    $history = new HistoryPlugin(); 
    $client->addSubscriber($history); 

    $response = $client->head($url)->send(); 

    if (!$response->isSuccessful()) { 
     throw new \Exception(sprintf("Url %s is not a valid URL or website is down.", $url)); 
    } 

    return $response->getEffectiveUrl(); 
} 
संबंधित मुद्दे