我正在尝试将浏览器与提供服务器发送事件 (SSE) 的服务器连接。此服务器具有与原始服务器不同的域。例如,如果您调用http://d1.example.com/page
此页面将尝试连接到上的 SSE 频道http://d2.example.com/subscribe
。尝试这样做会提示以下错误:
Uncaught Error: SECURITY_ERR: DOM Exception 18
在线上:
var source = new EventSource("http://d2.example.com/subscribe")
我该如何解决?
更新(我尝试过的解决方案):
1-CORS
我通过添加到我的 web 服务的标头来尝试CORS。它没有解决问题,即使来自页面的调用现在工作正常!我认为 SSE 适用于正常的 HTTP 请求,那么为什么它不适用于 Chrome?Access-Control-Allow-Origin:*
d2.example.com
EventSource
$.get("http://d2.example.com")
d1.example.com
2-重定向
我正在使用 httpd 服务器,因此我在d1.example.com
虚拟主机中创建了一个重定向规则,将 SSE 请求传递到d2.example.com
. 它与 Firefox 完美配合。另一方面,Chrome 没有提示任何错误,也没有连接到 SSE 服务器。看起来它转储了整个EventSource
命令。看起来这个解决方案永远不会起作用,所以让我们继续......
3-反向代理
连接的两个浏览器d1.example.com/subscribe
基本上都是d2.example.com
通过反向代理连接的。但是on_close
即使浏览器关闭,事件也永远不会被捕获。这是有道理的,因为 d2 服务器现在正在与代理服务器建立通道。如何将on_close
事件从代理服务器转发到 d2?
是否有任何不同的方法可以使这项工作?