我正在尝试将浏览器与提供服务器发送事件(SSE)的服务器连接。此服务器的域与原始域不同。例如,如果您调用http://d1.example.com/page
,则此页面将尝试连接到http://d2.example.com/subscribe
上的SSE channel 。尝试执行此操作将提示以下错误:Uncaught Error: SECURITY_ERR: DOM Exception 18
在线上:var source = new EventSource("http://d2.example.com/subscribe")
我该如何解决?
更新(我已经尝试过的解决方案):
1- CORS
我通过将Access-Control-Allow-Origin:*
添加到Web服务d2.example.com
的 header 中来尝试CORS。尽管现在EventSource
页面上的$.get("http://d2.example.com")
调用工作正常,但它不能解决d1.example.com
问题。我以为SSE适用于正常的HTTP请求,那么为什么它不能在Chrome上运行?
2-重定向
我正在使用httpd服务器,因此我在d1.example.com
虚拟主机中创建了重定向规则,该规则将SSE请求传递给d2.example.com
。它与Firefox完美配合。另一方面,Chrome浏览器未提示任何错误,也未连接到SSE服务器。好像它转储了整个EventSource
命令。看来此解决方案永远无法使用,所以让我们继续...
3-反向代理
两种浏览器都在d1.example.com/subscribe
上连接,而d2.example.com
基本上是通过反向代理连接到on_close
的。但是即使关闭浏览器,也不会捕获on_close
事件。这很有意义,因为d2服务器现在正在与代理服务器建立通道。如何将ojit_code事件从代理服务器转发到d2?
有什么其他方法可以使这项工作吗?
最佳答案
可能性很高,这是跨域资源共享的问题,必须在相关域上启用它。
http://enable-cors.org/
正如MDN所说: