Xmlhttprequest के पुनर्निर्देशन को रोकें


112

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

जवाबों:


102

XMLHttpRequest ऑब्जेक्ट (जोड़ा गया जोर) के लिए W3C मानक के अनुसार नहीं :

यदि प्रतिक्रिया HTTP पुनर्निर्देशित है:

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

वे इसे भविष्य की रिलीज़ के लिए मान रहे थे :

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

  • निम्नलिखित रीडायरेक्ट को अक्षम करने के लिए संपत्ति;

लेकिन नवीनतम विनिर्देश में अब इसका उल्लेख नहीं है।


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

1
कुछ और खोज ने मुझे इस पुराने बग रिपोर्ट को लाया: Bugzilla.mozilla.org/show_bug.cgi?id=401564
ruquay

2
सहमत, पूरी तरह से रेडिकुलस डिजाइन दोष।
रस डेसीव

35

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

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 मिल जाएगा।


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

12

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



11

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.