事件源修改协议

EventSource Modifying Protocol

我在企业环境中工作,发现了一个我无法解决的问题。

这与 EventSource 将 URL 参数从 HTTP 更改为 HTTPS 有关。

const url = 'http://localhost:8080'; // <-- using HTTP not HTTPS
new window.EventSource(url);

这导致浏览器抛出此错误:

GET https://localhost:8080 net::ERR_TUNNEL_CONNECTION_FAILED

我正在使用 HTTPS 在网站上进行开发,所以这可能是设计使然,它使用相同的协议。有人遇到过这个问题或知道如何解决吗?

---更新---

看起来是设计使然。在另一个 HTTPS 站点上尝试此操作时,我得到了这个:

Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure EventSource endpoint 'http://localhost...'. This request has been blocked; the content must be served over HTTPS.

问题仍然存在,我该如何解决这个问题?

事件源不会在 http 和 https 之间改变。您使用的是 Chrome 或类似的 HTTPS Everywhere 插件吗?

我认为您受到了same-origin政策的打击。这意味着 SSE 连接必须是同源的,这基本上意味着相同的主机名和域、相同的方案(即 http 或 https)和相同的端口。

您可以使用 CORS 来解决这个问题。在 SSE 脚本 的顶部,您需要发回此 header:

Access-Control-Allow-Origin: *

这表示任何人都可以从任何地方连接并获取数据流。它必须在服务器脚本上完成,无法从客户端完成。 (按照设计:same-origin 政策的全部意义在于阻止人们未经许可使用他人的内容并将其伪装成自己的内容。)

Shameless Plug:请参阅我的书中的第 9 章(Data Push Apps with HTML5 SSE,O'Reilly)以更好地控制 allow-origin,以及它如何与 cookie 和基本身份验证交互.

顺便说一句,我注意到我提到 Chrome 不适用于 self-signed https 证书。老实说,我不确定情况是否仍然如此,但在使用 https 和 localhost 时也可能需要注意这一点。