Политика CORS в отношении веб-сокетов Chrome

У меня возникли проблемы с открытием веб-сокета в Chrome. Кажется, что в хроме есть некоторая политика CORS для веб-сокетов.

Если я нахожусь на www.example.com и пытаюсь открыть веб-сокет на api.example.com, на вкладке сети консоли будет написано «Ожидание», и будет запущена ошибка onerror с сообщением WebSocket connection to 'wss://api.example.com' failed: Connection closed before receiving a handshake response. Если я смотрю на сервер, я не вижу запроса на подключение к веб-сокету, поэтому нет ответа на запрос опций или возможность установить заголовок Access-Control-Allow-Origin. Однако, если я сначала сделаю запрос на api.example.com, который в браузере перенаправит меня обратно на www.example.com, он будет работать нормально.

Вы должны использовать один и тот же источник для запросов веб-сокетов в Chrome?

Примечание: эта проблема только с хромом.


person Josh Wilson    schedule 25.03.2014    source источник
comment
Судя по датам здесь, похоже, что это было проблемой в течение длительного времени, но сегодня мы воспроизвели ее в некоторых случаях в Chrome, и команда Chromium утверждает, что это был недавний регресс. Следите за отчетом об ошибке здесь: crbug.com/993907.   -  person Nick G    schedule 30.08.2019


Ответы (4)


В WebSocket нет принудительного браузера CORS. Вот две вещи, которые могут пойти не так (при условии, что вы используете и HTTPS, и WSS):

  • сервер применяет Origin. Заголовок HTTP Origin устанавливается браузером в качестве источника HTML-страницы, содержащей JavaScript, который открывает соединение WebSocket. Сервер МОЖЕТ проверить этот заголовок и отклонить его. Но поскольку вы говорите, что другие браузеры работают (какие?), это маловероятно.
  • поскольку вы используете wss, сертификат сервера ДОЛЖЕН быть полностью действительным и приемлемым для браузера без вмешательства пользователя. Так ли это?
person oberstet    schedule 25.03.2014
comment
Мне трудно поверить, что проблема с Chrome не связана с CORS. У меня это работает, сначала отправив запрос параметров на мой сервер. Соединение через веб-сокет работает должным образом, если запрос опций проходит успешно. - person Josh Wilson; 26.03.2014
comment
Как уже говорилось, CORS не применяется к WebSocket. - person oberstet; 26.03.2014

Я снова столкнулся с этой проблемой. Я до сих пор не понял, почему, но выполнение OPTIONS (или любого другого) запроса к поддомену сначала позволяет открыть соединение.

Кажется, это проблема только с соединениями wss, и она возникает в нескольких доменах и сертификатах.

person Josh Wilson    schedule 16.12.2015

Похоже, это связано с отправкой запросов из разных источников, которые не являются «простыми». 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

person mhgbrown    schedule 20.10.2016
comment
Как можно было бы сделать не простое соединение Websocket? Конструктор WS не принимает никаких параметров, что означает, что вы не можете а) устанавливать собственные заголовки или б) использовать глагол, отличный от GET. - person Coderer; 08.07.2020

Попробуйте установить заголовок Access-Control-Allow-Origin на api.example.com, который разрешает www.example.com.

person webinista    schedule 25.03.2014
comment
Это не поможет, так как запрос никогда не делается. Обновление вопроса, чтобы описать это. - person Josh Wilson; 26.03.2014
comment
У меня похожая проблема, мое приложение создано с использованием Angular 7. Я делаю вызов ajax на сервер BPMS, который отлично работает в IE, но у меня есть ошибка CORS в Chrome. Однако, когда я копирую URL-адрес ajax в браузер Chrome, у меня есть все данные. Кто-нибудь может помочь? - person David Sagang; 18.08.2020