En yeni Web Tarayıcılarından ayırmanın bir yolu yoktur.
W3C Özellikleri:
Aşağıdaki adımlar, kullanıcı aracılarının basit bir çapraz kaynak talebi için ne yapması gerektiğini açıklar :
Talepte bulunma adımlarını uygulayın ve istekte bulunurken aşağıdaki istek kurallarına uyun.
Manuel yeniden yönlendirme bayrağı ayarlanmamışsa ve yanıt 301, 302, 303, 307 veya 308 HTTP durum koduna sahipse
, yeniden yönlendirme adımlarını uygulayın.
Son kullanıcı isteği iptal ederse,
iptal adımlarını uygulayın.
Ağ hatası varsa
DNS hataları, TLS anlaşması hatası veya diğer tür ağ hataları durumunda, ağ hatası adımlarını uygulayın . Herhangi bir son kullanıcı etkileşimi talep etmeyin.
Not: Bu, 410 HTTP durum kodu gibi bazı hata türlerini gösteren HTTP yanıtlarını içermez.
Aksi takdirde,
bir kaynak paylaşım kontrolü yapın. Başarısız olursa, ağ hatası adımlarını uygulayın. Aksi takdirde, pass dönerse, bu algoritmayı sonlandırın ve çapraz orijinli istek durumunu başarılı olarak ayarlayın. Aslında isteği sonlandırmayın.
Okuyabileceğiniz gibi, ağ hataları, hataları içeren HTTP yanıtını içermez, bu nedenle durum kodu olarak her zaman 0 ve hata olarak "" alacaksınız.
Kaynak
Not : Aşağıdaki örnekler, Google Chrome Sürüm 43.0.2357.130 kullanılarak ve OP birini taklit etmek için oluşturduğum bir ortama karşı yapılmıştır. Kurma kodu cevabın alt kısmındadır.
Bunu çözmek için bir yaklaşımın HTTPS yerine HTTP üzerinden ikincil bir istek yapmak olacağını düşündüm. Bu yanıt, ancak tarayıcıların daha yeni sürümlerinin karışık içeriği engellediği için bunun mümkün olmadığını hatırladım.
Bu, HTTPS kullanıyorsanız Web Tarayıcısının HTTP üzerinden bir isteğe izin vermeyeceği anlamına gelir ve bunun tersi de geçerlidir.
Bu, birkaç yıldan beri böyleydi, ancak Mozilla Firefox gibi eski Web Tarayıcısı sürümleri, 23 sürümleri buna izin veriyor.
Bununla ilgili kanıt:
HTTPS usign Web Broser konsolundan HTTP isteğinde bulunma
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();
aşağıdaki hataya neden olur:
Karışık İçerik: ' https: // localhost: 8000 / ' adresindeki sayfa HTTPS üzerinden yüklendi, ancak güvenli olmayan bir XMLHttpRequest uç noktası ' http: // localhost: 8001 / ' istedi . Bu istek engellendi; içerik HTTPS üzerinden sunulmalıdır.
Bunu bir Iframe eklemek gibi başka şekillerde yapmaya çalışırsanız, tarayıcı konsolunda aynı hata görünecektir.
<iframe src="http://localhost:8001"></iframe>
Soket bağlantısının kullanılması da bir cevap olarak gönderildi , sonucun aynı / benzer olacağından oldukça emindim ama denedim.
Güvenli olmayan bir soket uç noktasına HTTPS kullanarak Web Tarayıcısından bir soket bağlantısı açmaya çalışmak karma içerik hatalarıyla sonuçlanacaktır.
new WebSocket("ws://localhost:8001", "protocolOne");
1) Karışık İçerik: ' https: // localhost: 8000 / ' adresindeki sayfa HTTPS üzerinden yüklendi, ancak güvenli olmayan WebSocket uç noktası 'ws: // localhost: 8001 /' ile bağlanmaya çalıştı. Bu istek engellendi; bu uç nokta WSS üzerinden kullanılabilir olmalıdır.
2) Yakalanmamış DOMException: 'WebSocket' oluşturulamadı: Güvenli olmayan bir WebSocket bağlantısı HTTPS üzerinden yüklenmiş bir sayfadan başlatılamayabilir.
Sonra da bir wss uç noktasına bağlanmayı denedim.Ağ bağlantı hataları hakkında bazı bilgileri okuyabilir miyim?
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
Snippet'i Sunucu kapalıyken yürütmek şu sonuçları doğurur:
'Wss: // localhost: 8001 /' için WebSocket bağlantısı başarısız oldu: Bağlantı kurulurken hata: net :: ERR_CONNECTION_REFUSED
Yukarıdaki parçacığı Sunucu Açıkken yürütme
'Wss: // localhost: 8001 /' ile WebSocket bağlantısı başarısız oldu: WebSocket açılış anlaşması iptal edildi
Ancak yine, konsola gönderilen "hata işlevi" hatası, bir hatayı diğerinden ayırt etmek için herhangi bir ipucu vermez.
Bu yanıtın önerdiği gibi bir proxy kullanmak işe yarayabilir, ancak yalnızca "hedef" sunucunun genel erişimi varsa.
Burada durum böyle değildi, bu yüzden bu senaryoda bir proxy uygulamaya çalışmak Bizi aynı soruna götürecektir.
Node.js HTTPS sunucusu oluşturma kodu :
Kendinden imzalı sertifikalar kullanan iki Nodejs HTTPS sunucusu oluşturdum:
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);
Çalışmasını sağlamak için Nodejs'nin Yüklü olması gerekir, Her sunucu için ayrı sertifikalar oluşturmanız ve uygun şekilde certs ve certs2 klasörlerinde saklamanız gerekir.
Run To sadece yürütmek node applicationServer.js
ve node targetServer.js
bir terminal (ubuntu örneğin) içinde.