नवीनतम वेब ब्राउज़र से इसे अलग करने का कोई तरीका नहीं है।
W3C विशिष्टता:
नीचे दिए गए चरणों का वर्णन है कि एक साधारण क्रॉस-ऑरिजिन अनुरोध के लिए उपयोगकर्ता एजेंटों को क्या करना चाहिए :
अनुरोध चरण बनाएं और अनुरोध करते समय नीचे दिए गए अनुरोध नियमों का पालन करें।
यदि मैन्युअल रीडायरेक्ट ध्वज अप्रचलित है और प्रतिक्रिया में 301, 302, 303, 307, या 308 का HTTP स्थिति कोड है,
तो रीडायरेक्ट चरणों को लागू करें।
यदि अंतिम उपयोगकर्ता अनुरोध को रद्द कर देता है
तो गर्भपात के चरणों को लागू करें।
यदि कोई नेटवर्क त्रुटि
है DNS त्रुटियों, TLS बातचीत विफलता या नेटवर्क त्रुटियों के अन्य प्रकार के मामले में, नेटवर्क त्रुटि चरण लागू करें । किसी भी प्रकार के अंतिम उपयोगकर्ता सहभागिता का अनुरोध न करें।
नोट: इसमें HTTP प्रतिक्रियाएँ शामिल नहीं हैं जो कुछ प्रकार की त्रुटि को इंगित करती हैं, जैसे HTTP स्थिति कोड 410।
अन्यथा
संसाधन साझाकरण जांच करें। यदि यह विफल रहता है, तो नेटवर्क त्रुटि चरण लागू करें। अन्यथा, यदि यह पास हो जाता है, तो इस एल्गोरिथ्म को समाप्त करें और सफलता के लिए क्रॉस-मूल अनुरोध स्थिति सेट करें। वास्तव में अनुरोध को समाप्त न करें।
जैसा कि आप पढ़ सकते हैं, नेटवर्क त्रुटियों में HTTP प्रतिक्रिया शामिल नहीं है जिसमें त्रुटियां शामिल हैं, यही कारण है कि आपको हमेशा स्थिति कोड के रूप में 0 मिलेगा, और "" त्रुटि है।
स्रोत
नोट : निम्न उदाहरण Google Chrome संस्करण 43.0.2357.130 का उपयोग करके बनाए गए थे और एक वातावरण के खिलाफ जो मैंने ओपी एक का अनुकरण करने के लिए बनाया है। इसे सेट करने के लिए कोड उत्तर के निचले भाग में है।
हालांकि मुझे लगता है कि इस के आसपास काम करने के लिए HTTPS के बजाय HTTP पर एक द्वितीयक अनुरोध किया जाएगा क्योंकि यह उत्तर है लेकिन मुझे याद है कि ब्राउज़रों के नए संस्करण मिश्रित सामग्री को ब्लॉक करने के कारण संभव नहीं है।
इसका मतलब है कि अगर आप HTTPS का उपयोग कर रहे हैं और इसके विपरीत वेब ब्राउज़र HTTP पर अनुरोध नहीं करेगा।
यह कुछ साल पहले से ऐसा है, लेकिन पुराने वेब ब्राउज़र संस्करण जैसे मोज़िला फ़ायरफ़ॉक्स इसके नीचे के संस्करण 23 इसकी अनुमति देते हैं।
इसके बारे में साक्ष्य:
एचटीटीपीएस से HTTP अनुरोध करना वेब ब्रोसर कंसोल को असाइन करता है
var request = new XMLHttpRequest();
request.open('GET', "http://localhost:8001", true);
request.onload = function () {
console.log(request.responseText);
};
request.onerror = function () {
console.log(request.responseText);
};
request.send();
निम्नलिखित त्रुटि का परिणाम होगा:
मिश्रित सामग्री: HTTPS पर ' https: // localhost: 8000 / ' पेज लोड किया गया था, लेकिन एक असुरक्षित XMLHttpRequest समापन बिंदु ' http: // localhost: 8001 / ' का अनुरोध किया । इस अनुरोध को अवरुद्ध कर दिया गया है; सामग्री को HTTPS पर परोसा जाना चाहिए।
यदि आप अन्य तरीकों से ऐसा करने का प्रयास करते हैं तो एक समान त्रुटि ब्राउज़र कंसोल में दिखाई देगी।
<iframe src="http://localhost:8001"></iframe>
सॉकेट कनेक्शन का उपयोग करना भी एक उत्तर के रूप में पोस्ट किया गया था, मुझे पूरा यकीन था कि परिणाम समान / समान होगा लेकिन मैंने इसे आज़माया है।
HTTPS से नॉन सिक्योर सॉकेट एंडपॉइंट का उपयोग करके वेब ब्रॉसर से एक सॉकेट कनेक्शन खोलने की कोशिश मिश्रित सामग्री त्रुटियों में समाप्त हो जाएगी।
new WebSocket("ws://localhost:8001", "protocolOne");
1) मिश्रित सामग्री: HTTPS पर ' https: // localhost: 8000 / ' पेज लोड किया गया, लेकिन असुरक्षित WebSocket समापन बिंदु 'ws: // localhost: 8001 /' से कनेक्ट करने का प्रयास किया गया। इस अनुरोध को अवरुद्ध कर दिया गया है; यह समापन बिंदु WSS पर उपलब्ध होना चाहिए।
2) अनकैप्ड DOMException: 'WebSocket' का निर्माण करने में विफल: HTTPS पर लोड किए गए पेज से असुरक्षित WebSocket कनेक्शन शुरू नहीं किया जा सकता है।
फिर मैंने एक wss एंडपॉइंट से कनेक्ट करने की कोशिश की, यह भी देखें कि क्या मैं नेटवर्क कनेक्शन त्रुटियों के बारे में कुछ जानकारी पढ़ सकता हूं:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
सर्वर के साथ ऊपर स्निपेट निष्पादित करने के परिणाम सामने आए:
WebSocket कनेक्शन 'wss: // localhost: 8001 /' विफल: कनेक्शन स्थापना में त्रुटि: शुद्ध :: ERR_CONNECTION_REFUSED
सर्वर के साथ ऊपर स्निपेट को निष्पादित करना चालू हो गया
WebSocket कनेक्शन 'wss: // localhost: 8001 /' विफल: WebSocket खोलने के हैंडशेक को रद्द कर दिया गया था
लेकिन फिर से, कंसोल पर "ऑनरोर फ़ंक्शन" आउटपुट में जो त्रुटि है, वह किसी भी अन्य की एक त्रुटि को अलग करने के लिए कोई टिप नहीं है।
इस उत्तर के रूप में एक प्रॉक्सी का उपयोग करना सुझाव काम कर सकता है, लेकिन केवल अगर "लक्ष्य" सर्वर में सार्वजनिक पहुंच है।
यहां ऐसा नहीं था, इसलिए इस परिदृश्य में एक प्रॉक्सी को लागू करने की कोशिश करने से हमें उसी समस्या का सामना करना पड़ेगा।
कोड बनाने के लिए Node.js HTTPS सर्वर :
मैंने दो Nodejs HTTPS सर्वर बनाए हैं, जो स्व हस्ताक्षरित प्रमाणपत्र का उपयोग करते हैं:
targetServer.js:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./certs2/key.pem'),
cert: fs.readFileSync('./certs2/key-cert.pem')
};
https.createServer(options, function (req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
res.writeHead(200);
res.end("hello world\n");
}).listen(8001);
applicationServer.js:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('./certs/key.pem'),
cert: fs.readFileSync('./certs/key-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
यह काम करने के लिए आपको Nodejs इंस्टॉल करने की आवश्यकता होती है, प्रत्येक सर्वर के लिए अलग प्रमाण पत्र बनाने और उसके अनुसार फ़ोल्डरों के सिरे और certs2 में स्टोर करने की आवश्यकता होती है।
इसे चलाने के लिए बस निष्पादित करें node applicationServer.js
और node targetServer.js
एक टर्मिनल (ubuntu उदाहरण) में।