2012-08-30 3 views
10

Ich habe ein seltsames Verhalten von ExpressJS. Bei einer zweiten Anfrage an meine node.js/express-basierte API-URL gibt es immer 304 Not Modified-Antwortcode an IE zurück. Andere Browser erhalten 200 (Chrome/FF). Das Problem ist, dass es 304 zurückgibt, selbst wenn der Inhalt tatsächlich geändert wurde. Ich habe versucht zu suchen und konnte nichts zu dem Thema finden. Außerdem habe ich versucht, einen Unterschied in den Anforderungsheadern von IE und Chrome zu finden, und konnte jeden Header sehen, der das verursachen könnte. Jede Hilfe wird geschätzt.Express gibt 304 für IE repeative Anfragen zurück

Ich habe die Verbindung hinzuzufügen via SSL geht, falls es darauf ankommt

+0

Wie bestimmen Sie, welchen Antwortcode IE bekommt? – josh3736

+0

+1 Ich habe das gleiche Problem! – Erik

+0

josh3736, Ich überprüfe Netzwerkprotokoll in IE Developer Tools – bbbonthemoon

Antwort

2

Nun, habe ich es geschafft, es zu beheben durch Hinzufügen von Cache-Control-Header

+0

Das ist eher eine Problemumgehung. Hoffentlich kann jemand eine Lösung posten. – Brad

3

Der Cache-Control-Header ist eine Abhilfe. Der Fehler ist in der Internet Explorer-Interpretation der HTTP 1.1-Spezifikation für den Header.

Ich habe dies zu meinem Routen-Handler hinzugefügt, der das Problem gelöst hat. Sie brauchen auch eine oder ETag Header, aber Express war bereits das für mich senden.

res.setHeader("Expires", "-1"); 
res.setHeader("Cache-Control", "must-revalidate, private"); 

See: Make IE to cache resources but always revalidate

4

mit dem gleichen Problem sehe ich viel herum und es stellt sich, dass das Problem in der Tat von einem dummen aggressiven Caching von Ajax kommt Anfragen IE bekommen. In der Tat, wenn Sie diese 304 sehen, trifft die tatsächliche Anfrage nie den Server aber IE antwortet mit den neuesten Daten aus seinem Cache. Dies ist ein beabsichtigtes Verhalten von MS, und daher gibt es nur Problemumgehungen.

Meine bevorzugte ist es, an jede Ajax-Anfrage einen unbrauchbaren Abfrageparameter anzuhängen, der die aktuelle Zeit enthält. Dadurch wird der IE gezwungen, immer vom Server abzurufen. Der nette Teil ist, wenn Sie jQuery verwenden, können Sie es auf diese automatisch mit

$.ajaxSetup({cache:false}) 

Eine weitere Arbeit um so konfigurieren kann, ist POST-Anfragen verwenden anstelle von GET, aber das ist nicht immer eine Option.

Verwandte Themen