Я пытаюсь подключить браузеры к серверу, который предоставляет события, отправленные сервером (SSE). Этот сервер имеет домен, отличный от исходного. Например, если вы позвоните http://d1.example.com/page
, эта страница попытается подключиться к каналу SSE на http://d2.example.com/subscribe
. Попытка сделать это вызовет следующую ошибку:
Uncaught Error: SECURITY_ERR: DOM Exception 18
на линии:
var source = new EventSource("http://d2.example.com/subscribe")
Как я могу это исправить?
Обновление (решения, которые я опробовал):
1- КОРС
Я попробовал CORS, добавив Access-Control-Allow-Origin:*
в заголовки моего веб-сервиса d2.example.com
. Это не решило EventSource
проблему, хотя $.get("http://d2.example.com")
вызовы с d1.example.com
страниц теперь работают нормально! Я думал, что SSE работает с обычными HTTP-запросами, так почему же он не работает в Chrome?
2- Перенаправить
Я использую сервер httpd, поэтому я создал правило перенаправления на виртуальном хосте d1.example.com
, которое передает запросы SSE на d2.example.com
. Он отлично работал с Firefox. С другой стороны, Chrome не выдавал никаких ошибок и не подключался к серверу SSE. Похоже, он сбросил всю команду EventSource
. Похоже, это решение никогда не сработает, так что давайте двигаться дальше...
3- Обратный прокси
Оба браузера подключены к d1.example.com/subscribe
, который в основном подключается к d2.example.com
через обратный прокси. Но событие on_close
никогда не перехватывается, даже если браузер закрыт. Это имеет смысл, так как сервер d2 теперь создает канал с прокси-сервером. Как я могу перенаправить событие on_close
с прокси-сервера на d2?
Есть ли другие способы, которые могли бы заставить это работать?