1

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

它与EventSource将 URL 参数从更改HTTPHTTPS.

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.

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

4

1 回答 1

2

事件源不会在 http 和 https 之间更改。你是在使用 Chrome 的 HTTPS Everywhere 插件,还是类似的插件?

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

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

Access-Control-Allow-Origin: *

这表示任何地方的任何人都可以连接并获取数据流。它必须在服务器脚本上完成,没有办法从客户端完成。(根据设计:同源政策的全部意义在于阻止人们在未经许可的情况下使用他人的内容并使其看起来像自己的内容。)

Shameless Plug:请参阅我的书(带有 HTML5 SSE 的数据推送应用程序,O'Reilly)中的第 9 章,以更好地控制允许来源,以及它如何与 cookie 和基本身份验证交互。

顺便说一句,我注意到我提到 Chrome 不能使用自签名 https 证书。老实说,我不确定是否仍然如此,但这也可能是使用 https 和 localhost 时需要注意的事情。

于 2017-10-07T08:19:46.973 回答