2017-10-06 90 views
1

我在公司環境中工作,發現我無法解決的問題。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.

的問題仍然存在,我怎麼解決這個得到什麼?

回答

0

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時可能還需要注意。