我在公司环境中工作,发现了一个我无法解决的问题。
这与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.
问题仍然存在,我该如何解决这个问题?
答案 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时,这也可能需要注意。