EventSource修改协议

时间:2017-10-06 17:36:05

标签: google-chrome http protocols eventsource

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

这与EventSource将网址参数从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.

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

1 个答案:

答案 0 :(得分:2)

在http和https之间,Eventsource不会改变。您使用的是针对Chrome的HTTPS Everywhere插件,还是类似的东西?

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

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

Access-Control-Allow-Origin: *

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

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

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