2008-10-23 15 views
93

के पुनर्निर्देशन को रोकें क्या XMLHttpRequest-s भेजते समय ब्राउज़र को पुनर्निर्देशित करने से रोकना संभव है (यानी रीडायरेक्ट स्थिति कोड वापस पाने और इसे स्वयं संभालने के लिए)?Xmlhttprequest

उत्तर

84

नहीं the W3C standard for the XMLHttpRequest object के अनुसार (जोर जोड़ा): प्रतिक्रिया एक HTTP रीडायरेक्ट है

हैं:

यदि वह URL स्थान हैडर से अवगत करा दिया की उत्पत्ति के साथ एक ही मूल है XMLHttpRequest उत्पत्ति और रीडायरेक्ट अनंत लूप सावधानियों का उल्लंघन नहीं करता है, पारदर्शी रीडायरेक्ट का पालन करते हुए वही मूल अनुरोध घटना नियम।

    :

    इस विनिर्देशन निम्नलिखित विशेषताएं जो किया जा रहा इस विनिर्देश के भविष्य के संस्करण के लिए माना जाता है शामिल नहीं है:

वे considering यह एक भविष्य के रिलीज के लिए थे

  • निम्नलिखित रीडायरेक्ट अक्षम करने के लिए संपत्ति;
  • लेकिन latest विनिर्देश अब इस का उल्लेख है।

    +4

    हास्यास्पद बात यह है कि जब पारदर्शी रीडायरेक्ट में मूल अनुरोध में सेट किए गए कुछ HTTP शीर्षलेखों को ओवरराइट करना शामिल होता है। विशेष रूप से, यदि "स्वीकार करें" शीर्षलेख किसी विशिष्ट सामग्री-प्रकार पर सेट किया गया था, तो फ़ायरफ़ॉक्स रीडायरेक्ट का पालन करते समय इस शीर्षलेख को शामिल करने में विफल रहता है (जो इस हेडर का उपयोग करने वाली पूरी तरह से आरईएसटी-आधारित वेब सेवाओं को विकसित करने में अधिक कठिन बनाता है ... बड़बड़ाना)। – ruquay

    +1

    कुछ और खोज ने मुझे यह पुरानी बग रिपोर्ट लाया: https://bugzilla.mozilla.org/show_bug.cgi?id=401564 – ruquay

    +1

    सहमति, पूरी तरह से rediculus डिजाइन दोष। – Rasive

    11

    नहीं, आप XMLHttpRequest द्वारा प्रकट एपीआई में कोई जगह नहीं है जो आपको 301 या 302 स्वचालित रूप से निम्नलिखित के डिफ़ॉल्ट व्यवहार को ओवरराइड करने की अनुमति देता है।

    यदि क्लाइंट विंडोज़ पर आईई चला रहा है तो आप उस व्यवहार को रोकने के लिए एक विकल्प सेट करने के बजाय WinHTTP का उपयोग कर सकते हैं लेकिन यह एक बहुत ही सीमित समाधान है।

    12

    आप रीडायरेक्ट गंतव्य प्राप्त करने के लिए responseURL संपत्ति का उपयोग कर सकते हैं या जांच सकते हैं कि प्रतिक्रिया आपके द्वारा स्वीकार किए जाने वाले स्थान से अंततः प्राप्त की गई थी या नहीं।
    इसका मतलब है कि परिणाम वैसे भी लाया जाता है, लेकिन कम से कम आप रीडायरेक्ट गंतव्य के बारे में आवश्यक जानकारी प्राप्त कर सकते हैं और उदाहरण के लिए जब आप प्रतिक्रिया को त्यागना चाहते हैं तो स्थितियों का पता लगाएं।

    19

    नई Fetch API रीडायरेक्ट से निपटने के विभिन्न तरीकों का समर्थन करता है: follow, error, और manual, लेकिन मैं जब पुनर्निर्देशन रद्द कर दिया गया नया URL या स्थिति कोड देखने के लिए एक रास्ता नहीं मिल रहा। आप केवल पुनर्निर्देशन को रोक सकते हैं, और फिर यह एक त्रुटि (खाली प्रतिक्रिया) की तरह दिखता है। यदि आपको बस इतना ही चाहिए, तो आप जाने के लिए अच्छे हैं। आपको यह भी पता होना चाहिए कि इस एपीआई के माध्यम से किए गए अनुरोध रद्द करने योग्य yet नहीं हैं। वे are अब।

    XMLHttpRequest का सवाल है, आप सर्वर HEAD और निरीक्षण चाहे URL बदल गया है सकते हैं:

    var http = new XMLHttpRequest(); 
    http.open('HEAD', '/the/url'); 
    http.onreadystatechange = function() { 
        if (this.readyState === this.DONE) { 
         console.log(this.responseURL); 
        } 
    }; 
    http.send(); 
    

    आप स्थिति कोड नहीं मिल जाएगा, लेकिन से पूरे पृष्ठ डाउनलोड किए बिना नया URL मिलेगा यह।

    +0

    कभी-कभी 'विकल्प' का उपयोग करना बेहतर विकल्प हो सकता है, वैसे भी केवल गैर सामान्य उद्देश्य के लिए काम करता है, आदि। व्यवस्थापक ने पूरी साइट/स्कीमा को रीडायरेक्ट किया है, जैसे HTTP -> HTTPS –