Không có cách nào để phân biệt nó với các Trình duyệt Web mới nhất.
Đặc điểm kỹ thuật W3C:
Các bước bên dưới mô tả những gì tác nhân người dùng phải làm cho một yêu cầu đa nguồn gốc đơn giản :
Áp dụng các bước thực hiện yêu cầu và tuân thủ các quy tắc yêu cầu bên dưới khi thực hiện yêu cầu.
Nếu cờ chuyển hướng thủ công không được đặt và phản hồi có mã trạng thái HTTP là 301, 302, 303, 307 hoặc 308 Hãy
áp dụng các bước chuyển hướng.
Nếu người dùng cuối hủy yêu cầu
Áp dụng các bước hủy bỏ.
Nếu có lỗi mạng
Trong trường hợp lỗi DNS, lỗi thương lượng TLS hoặc các loại lỗi mạng khác, hãy áp dụng các bước lỗi mạng . Không yêu cầu bất kỳ loại tương tác người dùng cuối nào.
Lưu ý: Điều này không bao gồm các phản hồi HTTP cho biết một số loại lỗi, chẳng hạn như mã trạng thái HTTP 410.
Nếu không thì
Thực hiện kiểm tra chia sẻ tài nguyên. Nếu nó trả về không thành công, hãy áp dụng các bước lỗi mạng. Ngược lại, nếu nó trả về pass, hãy chấm dứt thuật toán này và đặt trạng thái yêu cầu nguồn gốc chéo thành thành công. Không thực sự chấm dứt yêu cầu.
Như bạn có thể đọc, lỗi mạng không bao gồm phản hồi HTTP bao gồm lỗi, đó là lý do tại sao bạn sẽ luôn nhận được 0 dưới dạng mã trạng thái và "" là lỗi.
Nguồn
Lưu ý : Các ví dụ sau được tạo bằng Google Chrome Phiên bản 43.0.2357.130 và dựa trên môi trường mà tôi đã tạo để mô phỏng OP một. Mã cho thiết lập nó nằm ở cuối câu trả lời.
Tôi mặc dù cách tiếp cận Để giải quyết vấn đề này sẽ là thực hiện một yêu cầu phụ qua HTTP thay vì HTTPS như Câu trả lời này nhưng tôi nhớ rằng điều đó là không thể do các phiên bản trình duyệt mới hơn chặn nội dung hỗn hợp.
Điều đó có nghĩa là Trình duyệt web sẽ không cho phép yêu cầu qua HTTP nếu bạn đang sử dụng HTTPS và ngược lại.
Điều này đã xảy ra như vậy từ vài năm trước nhưng các phiên bản Trình duyệt Web cũ hơn như Mozilla Firefox dưới phiên bản 23 cho phép nó.
Bằng chứng về nó:
Đưa ra yêu cầu HTTP từ bảng điều khiển Web Broser của HTTPS usign
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();
sẽ dẫn đến lỗi sau:
Nội dung hỗn hợp: Trang tại ' https: // localhost: 8000 / ' đã được tải qua HTTPS, nhưng đã yêu cầu điểm cuối XMLHttpRequest không an toàn ' http: // localhost: 8001 / '. Yêu cầu này đã bị chặn; nội dung phải được phân phát qua HTTPS.
Lỗi tương tự sẽ xuất hiện trong bảng điều khiển của trình duyệt nếu bạn cố gắng thực hiện việc này theo các cách khác như thêm Iframe.
<iframe src="http://localhost:8001"></iframe>
Sử dụng kết nối Socket cũng đã được Đăng như một câu trả lời , tôi khá chắc chắn rằng kết quả sẽ giống nhau / tương tự nhưng tôi đã thử.
Cố gắng Mở kết nối ổ cắm từ Web Broswer bằng HTTPS đến điểm cuối ổ cắm không Bảo mật sẽ kết thúc bằng lỗi nội dung hỗn hợp.
new WebSocket("ws://localhost:8001", "protocolOne");
1) Nội dung hỗn hợp: Trang tại ' https: // localhost: 8000 / ' đã được tải qua HTTPS, nhưng đã cố kết nối với điểm cuối WebSocket không an toàn 'ws: // localhost: 8001 /'. Yêu cầu này đã bị chặn; điểm cuối này phải có sẵn trên WSS.
2) Không có DOMException: Không tạo được 'WebSocket': Kết nối WebSocket không an toàn có thể không được khởi tạo từ một trang được tải qua HTTPS.
Sau đó, tôi cũng đã cố gắng kết nối với một điểm cuối wss, hãy xem Nếu tôi có thể đọc một số thông tin về lỗi kết nối mạng:
var exampleSocket = new WebSocket("wss://localhost:8001", "protocolOne");
exampleSocket.onerror = function(e) {
console.log(e);
}
Thực thi đoạn mã ở trên với Máy chủ bị tắt dẫn đến:
Kết nối WebSocket với 'wss: // localhost: 8001 /' không thành công: Lỗi khi thiết lập kết nối: net :: ERR_CONNECTION_REFUSED
Thực thi đoạn mã ở trên với Máy chủ được bật
Kết nối WebSocket với 'wss: // localhost: 8001 /' không thành công: Bắt tay mở WebSocket đã bị hủy
Nhưng một lần nữa, lỗi mà "chức năng onerror" xuất ra bảng điều khiển không có bất kỳ mẹo nào để phân biệt lỗi này với lỗi khác.
Sử dụng proxy như gợi ý câu trả lời này có thể hoạt động nhưng chỉ khi máy chủ "đích" có quyền truy cập công khai.
Đây không phải là trường hợp ở đây, vì vậy việc cố gắng triển khai một proxy trong trường hợp này sẽ dẫn Chúng ta đến cùng một vấn đề.
Mã để tạo máy chủ HTTPS Node.js :
Tôi đã tạo hai máy chủ HTTPS của Nodejs, sử dụng chứng chỉ tự ký:
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);
Để làm cho nó hoạt động, bạn cần phải Cài đặt Nodejs, Cần tạo các chứng chỉ riêng biệt cho từng máy chủ và lưu trữ nó trong các thư mục certs và certs2 tương ứng.
Để chạy nó chỉ cần thực thi node applicationServer.js
và node targetServer.js
trong một thiết bị đầu cuối (ví dụ ubuntu).