Próbuję połączyć przeglądarki z serwerem, który udostępnia zdarzenia wysłane przez serwer (SSE). Ten serwer ma inną domenę niż pierwotna. Na przykład, jeśli zadzwonisz pod numer http://d1.example.com/page
, ta strona spróbuje połączyć się z kanałem SSE pod numerem http://d2.example.com/subscribe
. Próbując zrobić poprosi następujący błąd:Błąd SSE Uncaught: SECURITY_ERR: DOM Exception 18 z serwerem udostępniającym zdarzenia wysłane przez serwer (SSE)
Uncaught Error: SECURITY_ERR: DOM Exception 18
na linii:
var source = new EventSource("http://d2.example.com/subscribe")
Jak mogę to naprawić?
Update (Rozwiązania, które próbowałem out):
1- CORS
Próbowałem CORS dodając Access-Control-Allow-Origin:*
do nagłówków mojego serwisu WWW d2.example.com
. To nie rozwiązało problemu z EventSource
, mimo że połączenia $.get("http://d2.example.com")
od d1.example.com
działają teraz dobrze! Myślałem, że SSE działa na zwykłych żądaniach HTTP, więc dlaczego nie działa w Chrome?
2- Przekierowanie
Używam serwera httpd, więc stworzyłem regułę przekierowania w d1.example.com
wirtualnego hosta, który przekazuje żądania SSE do d2.example.com
. Doskonale działało z Firefoksem. Z drugiej strony Chrome nie monitował o żaden błąd i nie łączył się z serwerem SSE. Wygląda na to, że porzuciło całą komendę EventSource
. Wygląda na to, to rozwiązanie nie będzie działać, więc przejdźmy dalej ...
3- reverse proxy
obu przeglądarkach podłączone d1.example.com/subscribe
który jest w zasadzie z połączeniem d2.example.com
przez reverse proxy. Ale zdarzenie on_close
nigdy nie zostanie przechwycone, nawet jeśli przeglądarka jest zamknięta. Ma to sens, ponieważ serwer d2 tworzy teraz kanał z serwerem proxy. Jak mogę przekazać zdarzenie z serwera proxy do d2?
Czy istnieją różne sposoby, aby to zadziałało?
@Jack To nie to samo pytanie. To pytanie nie wymaga pliku. Plik jest dość łatwy, możesz ustawić regułę przekierowania jako najgorszy scenariusz lub odwrotny serwer proxy. SSE nie będzie działać według tych rozwiązań. – wael34218