Chrome Websockets CORS 政策
Posted
技术标签:
【中文标题】Chrome Websockets CORS 政策【英文标题】:Chrome Websockets CORS policy 【发布时间】:2014-05-03 21:00:07 【问题描述】:我在 Chrome 中打开 websocket 时遇到问题。 chrome 中似乎有一些针对 websockets 的 CORS 策略。
如果我在 www.example.com 上并尝试在 api.example.com 打开 websocket,它会在控制台网络选项卡上显示挂起,并会触发 onerror 并显示消息 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。
【问题讨论】:
根据这里的日期,这样的问题已经存在很长时间了,但我们今天在某些情况下在 Chrome 中重现了它,Chromium 团队声称这是最近的回归。在此处关注错误报告:crbug.com/993907 【参考方案1】:尝试在允许 www.example.com 的 api.example.com 上设置 Access-Control-Allow-Origin
标头。
【讨论】:
这无济于事,因为从未提出过请求。更新问题以描述这一点。 我有类似的问题,我的应用程序是使用 Angular 7 构建的。我正在对 BPMS 服务器进行 ajax 调用,该服务器在 IE 中运行良好,但在 Chrome 中出现 CORS 错误。但是,当我将 ajax url 复制到 Chrome 浏览器时,我拥有所有数据。有人可以帮忙吗?【参考方案2】:WebSocket 没有浏览器强制执行 CORS。以下是可能出错的两件事(假设您同时使用 HTTPS 和 WSS):
服务器强制执行Origin
。 Origin
HTTP 标头由浏览器设置为包含打开 WebSocket 连接的 javascript 的 html 页面的来源。服务器可以检查该标头并拒绝。但既然你说其他浏览器正在运行(哪个?),这不太可能
由于您使用的是wss
,服务器证书必须完全有效,并且浏览器可以接受无需任何用户交互。是这样吗?
【讨论】:
我很难相信 Chrome 的问题与 CORS 无关。我通过首先向我的服务器发送选项请求来使其工作。如果选项请求成功通过,则 websocket 连接按预期工作。 如前所述,CORS 不适用于 WebSocket。【参考方案3】:我又遇到了这个问题。我还没有弄清楚为什么,但是首先向子域发出OPTIONS
(或任何其他)请求允许打开连接。
这似乎只是 wss 连接的问题,并且已经跨多个域和证书弹出。
【讨论】:
【参考方案4】:这听起来像是与发出不“简单”的跨域请求有关。不简单的 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
【讨论】:
如何建立一个“非简单”的 Websocket 连接? WS 构造函数不接受任何选项,这意味着您不能 a) 设置自定义标头,或 b) 使用 GET 以外的动词。以上是关于Chrome Websockets CORS 政策的主要内容,如果未能解决你的问题,请参考以下文章
CORS 政策问题刚刚开始,没有代码更改 - “CORS 政策:'Access-Control-Allow-Origin' 标头包含多个值”