2011-07-20 23 views
8

पर रीडायरेक्ट की एक स्ट्रिंग को हल करता है मुझे पता है कि रीडायरेक्ट स्वचालित रूप से पालन किए जाते हैं, और उस प्रक्रिया पर मेरे पास बहुत कम नियंत्रण नहीं है। यह ठीक है, लेकिन मुझे अभी भी बहुत दिलचस्पी है कि मेरा अनुरोध आखिरकार समाप्त हो गया है। क्या यह देखना संभव है कि मेरा अनुरोध आखिर में क्या होगा?यह निर्धारित करना कि jQuery .ajax()

मैं नहीं वापस आने वाले HTML पर भरोसा करना चाहता हूं ताकि मुझे यह बताने के लिए कि मैं कहां हूं।

नमूना कोड:

var originalURL = '/this/will/be/redirected'; 
$.ajax({ 
    url: originalURL, 
    dataType: "html", 
    success: function(data, statusText, jqXHR) { 
     var endPointURL = insertMagicHere(); 
     alert("Our query to " + original + " ended up at " + endPointURL + "!"); 
    } 
}); 

मैं इसके लिए jqXHR में चारों ओर देख रहा हूँ, लेकिन कोई किस्मत अब तक। (हालांकि, मैं इन सभी के लिए नया हूं, शायद मेरी नाक के ठीक नीचे)

+0

क्या [यह मौजूदा स्टैक ओवरफ्लो प्रश्न] (http://stackoverflow.com/questions/4465547/capture-redirect-location-of-javascript-xmlhttprequest) इसे हल करने में आपकी सहायता करता है? अफसोस की बात है, ऐसा लगता है कि पुनर्निर्देशित स्थान पर कब्जा करने के लिए किसी प्रकार के सर्वर-साइड संशोधनों के बिना कोई रास्ता नहीं है। – OverZealous

+0

सहमत हुए। एक्सएचआर स्पेक के अनुसार, एक रीडायरेक्ट चुपचाप संभाला जाता है। मेरे परीक्षण में, 302 'readystatechange' को भी ट्रिगर नहीं करता है! – JAAulde

+0

संक्षिप्त उत्तर: अकेले jQuery में नहीं। पिछली बार मैंने कोशिश की, यहां तक ​​कि सभी कार्यक्रम श्रोताओं को भी पंजीकृत करने से मुझे रीडायरेक्ट का पता लगाने की अनुमति नहीं मिली। आप शायद एक गैर-क्रॉस-ब्राउज़र समाधान चाहते हैं (यानी एक छोटी फ्लैश मूवी और संभवतः crossdomain.xml)। – yingted

उत्तर

4

जहां तक ​​मुझे पता है (और टेस्टेट है) यह पता लगाने के लिए केवल एक ही संभव है अगर वहां एक रीडायरेक्ट किया गया है और कितने रीडायरेक्ट किए गए थे (लेकिन जहां नहीं)।

तुम एक मेरी कोड देखने के हो सकते हैं:

var xhr = $.ajax({ 
    url: originalURL, 
    dataType: "html", 
    success: function(data, statusText, jqXHR) { 
    console.log(data); 
    console.log(statusText); 
    console.log(jqXHR.getAllResponseHeaders()); 
    } 
}); 

मेरे देव मशीन पर jqXHR.getAllResponseHeaders() उत्पादन है कि तरह है:

Date: Fri, 05 Aug 2011 01:29:20 GMT 
Server: ... 
X-Powered-By: ... 
Content-Length: 5 
Keep-Alive: timeout=15, max=98 
Connection: Keep-Alive 
Content-Type: text/html 

Keep-Alive: timeout=15, max=98 लायक है पर एक गहरी नजर है करने के लिए। एक max=98

+0

यह एक ही सर्वर पर एक रीडायरेक्ट था? मुझे संदेह है कि सर्वर Keep-Alive समर्थन के लिए कनेक्शन की उपलब्ध संख्या में कमी कर सकता है। एक अलग सर्वर पर रीडायरेक्ट, या ऐसे सर्वर के साथ बातचीत जिसमें Keep-Alive समर्थन नहीं है, शायद इस विधि के साथ पता लगाने योग्य नहीं होगा। मैं बहुत गलत हो सकता हूं, हालांकि ... मैं केवल Keep-Alive में पढ़ रहा हूं। – JAAulde

+0

@JAAulde: हाँ परीक्षण किया गया पुनर्निर्देशन एक ही सर्वर पर था। मुझे नहीं पता कि परिणाम विभिन्न सर्वरों के साथ क्या होगा। – scube

+0

यह वास्तव में अच्छा है, वास्तव में, कम से कम हैक के लिए मैं काम कर रहा हूं .. – Chuck

1

XMLHttpRequest.responseXML में एक max=99 जबकि एक रीडायरेक्ट परिणामों में कोई रीडायरेक्ट परिणाम जिसका अर्थ यह एक baseURI संपत्ति जो स्थान है कि डेटा से डाउनलोड किया गया हो जाएगा है कि एक दस्तावेज है। मुख्य समस्या यह है कि responseXML केवल तभी सेट किया जाएगा जब आपको XML दस्तावेज़ वापस मिल जाए। Firefox में overrideMimeType() काम करता है का उपयोग कर, दस्तावेज़ में एक सिंटैक्स त्रुटि रिपोर्टिंग के बावजूद:

var r = new XMLHttpRequest(); 
r.open("GET", "http://google.com"); 
r.overrideMimeType("text/xml"); 
r.onload = function() 
{ 
    alert(r.responseXML.baseURI); 
} 
r.send(null); 

दुर्भाग्य से, क्रोम में आप एक असली XML दस्तावेज़ की जरूरत है, overrideMimeType() मदद नहीं करता है। और एमएसआईई इस विधि को भी लागू नहीं करता है (जो कि एक बड़ा सौदा नहीं है जो दस्तावेज़ स्रोत का निर्धारण करना असंभव प्रतीत होता है)।

+0

यह करीब है, लेकिन मुझे वहां काफी कुछ नहीं मिला है। विशेष रूप से क्योंकि मेरे मामले के लिए क्रॉस-ब्राउज़र संगतता वास्तव में बेहद महत्वपूर्ण है। – Chuck

0

मुझे यकीन नहीं है कि वे सर्वर के किनारे किस जादू का उपयोग कर रहे हैं, लेकिन www.longURL.com जो आप बात कर रहे हैं वह करता है।

वे में एक jQuery प्लग है: http://plugins.jquery.com/project/longurl

मुझे यकीन है कि यह से मध्यवर्ती कदम उठाए पाने के लिए नहीं कर रहा हूँ, लेकिन अपनी वेबसाइट

उनकी कोड अपने सर्वर के लिए अनुरोध भेजता इसमें रीडायरेक्ट शामिल हैं, इसलिए उन्होंने इसे करने का कोई तरीका निकाला होगा, जिसका अर्थ है कि उन्हें शायद इसे प्राप्त करने का कोई तरीका है।

इसका उपयोग करने के लिए आपको यह पता लगाने के लिए अपनी jQuery प्लगइन देखना होगा कि वे वास्तविक डेटा का अनुरोध कहां करते हैं।

संपादित

मुझे उस काफी अपर्याप्त जवाब को सही करने की अनुमति दें:

http://www.longURL.com एक सेवा है जो छोटा यूआरएल का विस्तार है।

उनकी मुख्य वेबसाइट (एक यूआरएल का विस्तार करने पर) जब तक आप अपने अंतिम गंतव्य तक नहीं पहुंच जाते, तब तक प्रत्येक रीडायरेक्ट को ट्रैक किया जाता है।

यदि आपने जो कुछ भी किया है, तो आप ऐसा करने में सक्षम हो सकते हैं।

दुर्भाग्यवश मुझे क्या पता नहीं है वे कर रहे हैं (उनके सर्वर से अनुरोध भेजने के अलावा जो शायद 303 के लिए विशेष रूप से सुनता है)।

उनकी jQuery प्लगइन उपयोगी हो सकती है या नहीं भी हो सकती है। यदि यह रीडायरेक्ट का खुलासा करता है और आप यह समझ सकते हैं कि सिस्टम को रिम करने के लिए कैसे आप इसे अपनी सेवा के माध्यम से प्राप्त कर सकते हैं, अन्यथा आप प्रारंभिक लिंक के लिए एक छोटा लिंक बना सकते हैं और परिणामों को उनकी सेवा के माध्यम से प्राप्त कर सकते हैं ... लगता है दर्दनाक, लेकिन यदि आप सर्वर सामान करने में असमर्थ/अक्षम नहीं हैं, तो शायद यह आपका सबसे अच्छा विकल्प है।

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