EventSource修改协议
我在公司环境中工作,发现我无法解决的问题。EventSource修改协议
它与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.
的问题仍然存在,我怎么解决这个得到什么?
Eventsource在http和https之间不会改变。您是否使用适用于Chrome的HTTPS Everywhere插件或类似的东西?
我认为你正在被同源策略所击中。这意味着SSE连接必须位于相同的原始位置,这基本上意味着相同的主机名和域,相同的方案(即既可以是http,也可以是两个https)以及相同的端口。
您可以使用CORS来解决这个问题。在你SSE脚本的顶部你需要发回这个头:
Access-Control-Allow-Origin: *
这表示任何人,在任何地方,允许连接和获取数据流。它必须在服务器脚本上完成,无法从客户端完成。 (根据设计:同源策略的全部要点是阻止人们使用其他人的内容并使其看起来像他们自己的内容,未经许可。)
无耻插头:请参阅我的书中的第9章(数据推送应用程序与HTML5 SSE,O'Reilly)更好地控制允许来源,以及它如何与cookie和基本身份验证进行交互。
顺便说一句,我注意到我提到Chrome不能使用自签名的https证书。说实话,我不确定这是否仍然如此,但使用https和localhost时可能还需要注意。