Chrome Websockets CORS政策

时间:2014-03-25 19:23:49

标签: javascript google-chrome websocket cors

我在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。

4 个答案:

答案 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标头。