JavaScript SSE und same Origin

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.680
Moin liebe CB gemeinde,

ich kämpfe mich derzeit mit NodeJS ab und komme nun patu nicht weiter.

Meine Seite öffnet per new EventSource eine verbindung zu einem NodeJS server und dort fängt schondas Porblem an.

Wie kann ich dort auf einen server zugreife, der zumindest einen anderen port hat?
Habe solangsam alles versucht.

Mein server läuft testweise auf dem Port 8765.

nun war mein erster versuch plump über
Code:
 var source = new EventSource('http://xxx.de:8765');

gibt natürlich ne security exception.

auch
Code:
var source = new EventSource(':8765');

klappt nur scheinbar. Das gibt so keie dom exception, aber chrome bricht die anfrage trotzdem ab (steht im netzwerk protokoll)
Same origin .......

dann wollte ich versuchen dem browser vorzugauckeln er befindet sich
auf der selben adresse + port.
das habe ich gemacht indem ich per htaccess und mod_rewirte die url /see/ eingerichtet habe die dann auf port 8765 verweist.

Javascript macht das mit, aber wieder blockiert chrome die anfrage :( (mit dem verweis das es sich um ein redirect handelt)

wie wird das i.d.r. gelöst? stehe gerade bissl aufm schlauch

edit:
hab gerade gefunden das man evtl. über eine subdoamin das problem umgehen kann, teste das nun mal

edit2: oder geht es nur mit json polling? :S
 
Zuletzt bearbeitet:
Dafür gibt es CORS, wird aber nicht von allen Browsern unterstützt. Generell solltest du das auf der gleichen Origin machen, du kannst ja deinem Webserver beibringen, dass bestimmte Request-URLs mit dem Proxy-Modul an den Node.js-Server weitergeleitet werden sollen.
Nachtrag: können doch einige Browser, mehr als ich in Erinnerung hatte. Wenn man das noch mit der EventSource-Unterstützung abgleicht, wird wahrscheinlich herauskommen, dass fast jeder Browser mit EventSource auch CORS kann.
Nachtrag2: Laut caniuse.com kann jeder Browser mit EventSource auch CORS ;)
 
Zuletzt bearbeitet:
solange es in chrome 20 lauffähog ist, ist der rest egal, ich habe nur das system verkauft.

werde mir das mit cors mal ansehen, danke
 
Habe nochmal oben nen Nachtrag gemacht ;) Jeder Browser mit CORS kann auch Server-Sent-Events ;)
Und Chrome 19 kann beides, somit auch Chrome 20.

CORS ist kinderleicht, so wie Server-Sent-Events ;)
 
also ich bin entweder zu blöd oder meine hilfe nicht richtig:

http://enable-cors.org/

habe dort in der htaccess den passenden eintrag gesetzt und wenn ich mir den header angucke den die datein nun mitschicken steht dort auch:

Access-Control-Allow-Origin:*

trotzdem fliegt mir eine DOM Exception 18 um die ohren. wieso?
 
wenn denn mal ein request bei meinem server ankommen würde.
Schon beim Laden der seite fliegt die exception und am server kommt nichts an, lasse mir direkt ausgeben wenn nur versucht wird einee verbindung aufzubauen.

wieso muss der node server das schicken? macht doch das ganze sicherheits konzept hinfällig, wenn jeder externe server einfach sagen kann: ist schon ok von hier daten zu nehmen, wäre es nicht sonnvoller wenn der webserver, der die daten zur verfügung stellt, explizit erlaubt von wo man noch welche bekommen darf?

dieses blöde EventSource objekt, stellt absolut 0 infos zur fehlermeldung zur verfügung -_-
 
Ist doch eigentlich logisch:

Du hast einen Server example.org(dein node.js server),nun soll example.com da Daten abfragen. Würdest du bei deinem example.com-Server im Header sagen "jup, greif mal auf example.org zu, ist voll ok", dann funktioniert das. Genauso kann aber auch der Server exilexample.com den Header einbinden und sein JavaScript auf deinen Server zugreifen lassen, aber das willst du ja nicht.
Deswegen muss der Server auf den zugegriffen wird im Antwort-Header die Erlaubnis senden.

Hast du mal den CORS-Checker auf http://enable-cors.org/ ausprobiert? (unten)

Nachtrag: Findet bei dir eventuell ein preflighted request statt?
 
Zuletzt bearbeitet:
ok irgendwie ist mir das zu viel exmaple.

ich habe den server
xxx.de
dort ereicht man die seite
auf xxx.de:8765 läuft der nodejs server

der cors checker sagt mir das xxx.de cors enabled ist
xxx.de:8765 der angeblich nicht, aber k.a. wie der das geprüft haben will, der nodejs server hat keine verbdinung registriert und auch nix geantwortet.

also nach deine erklärung kann es ja dann absolut nicht klappen, denn schon bevor das EventSource() Object erstellt wird ballert chrome mir eineDOM Exception um die ohren und die verbidnung kommt nie zustande, wie soll denn dann eine erlaubnis gesendet werden?

die same origin policy verbietet ja eigentlich auch eine verbidnung zu öffnen wenn nicht protokoll + host + ip gleich sind

gleich lade ich einfach alles von port 8765, soll der server das einfach an apache durchreichen, was weiß ich :p *frustriert*
 
Zuletzt bearbeitet:
Neija das Konzept von CORS ist eigentlich trotzdem eine Verbindung zu xxx.de:8765 zu öffnen und sich die Antwort-Header anzusehen. Ist kein CORS-Header da, sollte eine Exception fliegen. Komische Umsetzung, ich weiß, habs aber auch noch nie selbst getestet.
Wie gesagt, nicht xxx.de muss den CORS-Header haben, sondern xxx.de:8765.

Dein Leben machst du dir aber auf jedenfall einfacher (wenn möglich) durch eine Regel im Apache, dass eine bestimmte URL (die Server-Sent-Events-URL) an deinen Node.js Server geproxyt wird.
Mit einer Rewrite-Rule sollte das gehen (falls der Apache es unterstützt*) [1, 2]:
Code:
RewriteRule ^server-sent-events$ http://www.xxx.de:8765/ [P]


[1] http://httpd.apache.org/docs/current/rewrite/proxy.html
[2] http://stackoverflow.com/questions/...tead-of-redirection-with-htaccess-rewriterule

* eventuell kann das auch jeder, das weiß ich gerade nicht. Nicht meine Baustelle


Nachtrag: Eventuell musst du auch noch mehr für CORS angeben. Wie gesagt, ich weiß nur aus der Theorie wie CORs funktionieren soll.
 
Zuletzt bearbeitet:
mit demproxy habe ich auch schon gefunden, aber erstmal hinten an gestellt.
ich würde es ja begrüßen wenn chrome meine nodejs server mal nach nem header fragen würde, wie gesagt, er schmeißt eine exception und im netzwerk protokoll sehe ich das er die anfragen direkt canceld.

werde ich mich mal an den proxy setzen, obwohl chrome nichtmal eine subdomain mit versteckter weiterleitung akzeptiert, auch da erkennt er diese, mal gucken.

edit:
so ich komme gerade net weiter, dank plesk hab ich mir nun den gesamten webserver zerschossen dabei wollte ich nur das modul mod_proxy aktivieren und auf einmal (obwohl ich nichts selber verändert habe) kann der apache wegen mod_dav.so net starten.

ich gebs auch auf für heute, danke erstmal

edit2:

für alle die probleme haben wie ich.
Tatsächlich klappt es mit dem modul mod_proxy von apache ganz wunderbar! einfach eine htaccess alegen, fettich :)
 
Zuletzt bearbeitet:
Zurück
Oben