我在Chrome中打开websocket时遇到问题。似乎在chrome中有一些针对websockets的CORS策略。
如果我在www.example.com上并尝试在api.example.com上打开websocket,它会在控制台网络选项卡上显示待处理状态,并会使用消息WebSocket connection to 'wss://api.example.com' failed: Connection closed before receiving a handshake response
触发错误。如果我查看服务器,我没有看到进行Web套接字连接的请求,因此没有选项请求响应,或者能够设置Access-Control-Allow-Origin标头。
但是,如果我首先向api.example.com发出请求,请求浏览器将其重定向回www.example.com,它将正常运行。
您是否需要在chrome中使用相同的来源进行websocket请求?
注意:此问题仅适用于Chrome。
答案 0 :(得分:11)
没有浏览器使用WebSocket强制执行CORS。以下是可能出错的两件事(假设您同时使用HTTPS和WSS):
Origin
。浏览器将Origin
HTTP标头设置为包含打开WebSocket连接的JavaScript的HTML页面的原点。服务器可以检查该标头并拒绝。但既然你说其他浏览器正在工作(哪个?),这不太可能wss
,因此服务器证书必须完全有效,并且浏览器可以接受,而无需任何用户交互。是这种情况吗?答案 1 :(得分:1)
我再次遇到了这个问题。我仍然无法弄清楚原因,但是首先向子域发出选项(或任何其他)请求可以打开连接。
这似乎只是wss连接的问题,并且已经跨多个域和证书弹出。
答案 2 :(得分:1)
这听起来与制作非“简单”的跨源请求有关。不简单的HTTP请求由浏览器(至少Chrome)以“OPTIONS”自动“预检”。我猜测浏览器只是强制执行此行为。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests
答案 3 :(得分:0)
尝试在api.example.com上设置允许www.example.com的Access-Control-Allow-Origin
标头。