2012-12-27 55 views
6

我试图将浏览器与提供服务器发送事件(SSE)的服务器连接。该服务器具有与原始域不同的域。例如,如果您拨打http://d1.example.com/page此页面将尝试连接到http://d2.example.com/subscribe上的SSE频道。尝试这样做,会提示以下错误:SSE未捕获错误:SECURITY_ERR:DOM异常18与提供服务器发送事件(SSE)的服务器

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的头部试图CORS。它没有解决EventSource的问题,即使来自d1.example.com的呼叫现在工作正常!我认为SSE适用于正常的HTTP请求,那么为什么它不适用于Chrome?

2-重定向

我使用的httpd服务器,所以我创建在通过上证所要求d2.example.comd1.example.com虚拟主机重定向规则。它与Firefox完美配合。另一方面,Chrome没有提示任何错误,也没有连接到SSE服务器。它看起来像是倾销了整个EventSource命令。它看起来像这样的解决方案行不通,所以让我们继续前进......

3-反向代理

连接上d1.example.com/subscribe两种浏览器,其本质上是通过反向代理连接到d2.example.com。但是,即使浏览器关闭,也不会捕获on_close事件。这是有道理的,因为D2服务器现在正在与代理服务器建立通道。我如何将on_close事件从代理服务器转发到d2?

有什么不同的方法可以使这项工作?

+0

@Jack这是不一样的问题。这个问题不需要文件。一个文件是很容易的,你可以做一个重定向规则作为最坏的情况下或反向代理。上证所不会用这些解决方案。 – wael34218

回答

4

可能性很高这是一个跨源资源共享问题,您必须在相关域上启用该功能。

http://enable-cors.org/

正如MDN说:

Note: Although it's not yet part of the standard, EventSource supports CORS in Firefox 11 and later. This is expected to become standard soon.

+0

它不起作用。 'Access-Control-Allow-Origin:d2.example.com'现在显示在响应标题中。然而'EventSource(“http://d2.example.com/subscribe”)仍然会产生相同的错误。我正在使用Chrome – wael34218

+0

它正在使用Firefox,但不使用Chrome – wael34218

+4

1)CORS + EventSource现在是标准版本的一部分; 2)CORS + EventSource支持FF 11+,Opera 12+,并将在Chrome 25中支持; 3)你可以使用带有CORS支持的polyfill来支持EventSource – 4esn0k

相关问题