23

Situation: eine Google App Engine Seite mit meinem statischen Inhalt des default_expiration läuft auf "14d"Wie kann ich das Caching-Verhalten von Google App Engine in WebKit steuern (die Etags sind verrückt geworden)?

Problem: in Chrome und Safari, eine URL zu besuchen (nicht Nachladen, nur die Cursor in der Indienststellung Wenn Sie die Eingabetaste drücken und die Eingabetaste drücken, werden viele Anfragen mit If-None-Match-Headern ausgelöst. Die Antworten sind wie erwartet immer 304 Nicht geändert. Ich kann beobachten, wie diese Anfragen in einem Debug-Proxy wie Charles oder Fiddler ausgelöst werden.

Wollen Sie: um diese Anfragen und 304 Antworten vollständig für statischen Inhalt zu vermeiden - vertrauen Sie einfach den zwischengespeicherten Inhalt des Browsers, wenn es verfügbar ist.

Wir verwenden den Standard "statischen Cache-Inhalt für eine sehr lange Zeit, wir kümmern uns um das Anhängen? Version = {Version} Änderungen an unseren Abfrage-Strings, wenn wir das Cache-System zu sprengen, also würden wir wirklich gerne die 304 zu vermeiden.

Glaube: Ich denke, dass dies durch den Etag-Header verursacht wird, die App-Engine mit jeder statischen Inhaltsantwort sendet. Das App-Modul SDK tut nicht senden Sie diesen Header nach unten, und ich sehe dieses Verhalten 304 nicht, wenn Sie mit dem SDK herumspielen.

Irgendwelche Ratschläge? Können Sie Etags für den statischen Inhalt der App Engine deaktivieren?

aktualisiert mit einem Beispiel Stück statischen Inhalt:http://www.khanacademy.org/stylesheets/shared-package/compressed.css

+1

Können Sie eine URL zu diesem statischen Inhalt posten? Dann kann jemand überprüfen, welche Header Sie zurückgeben (läuft ab usw.). –

+0

Gute Idee, aktualisierte Frage – kamens

+0

Schön. Ich bin kein Experte für die Header, aber ich denke, die Antwort ist da. Ich sehe das für den 24. Dezember ab, das sieht gut aus. Ich sehe auch einen Etag-Header, eine Cache-Kontrolle und ein Alter, diese können beeinflussen, ob der Browser den Inhalt zwischenspeichert oder nicht. –

Antwort

8

Während ich glaube nicht, gibt es eine Möglichkeit, die Etags Header-Verhalten für GAE zu steuern, ist dies durch einen Fehler in WebKit verursacht, dass alle statischen Inhalte erneut heruntergeladen werden, wenn eine 302 Weiterleitung nach einem POST erhalten Anfrage.

Sobald WebKit diesen Fehler behebt, sollte das Problem verschwinden.

Wenn Sie müssen, können Sie diesen speziellen Redirect-nach-POST-Fehler vorübergehend umgehen, indem Sie über einen Refresh-Header umleiten, anstatt eine 302-Weiterleitung zu verwenden.

https://bugs.webkit.org/show_bug.cgi?id=38690

WebKit image reload on Post/Redirect/Get

http://www.google.com/support/forum/p/Chrome/thread?tid=72bf3773f7e66d68&hl=en

3

Chrome 9.0, Fenster. Beim Laden Ihrer Homepage werden default.css sowie alle anderen .css-Dateien aus dem Cache bereitgestellt, ohne eine Anfrage zu stellen. Ich denke, dies ist ein Browser-spezifisches Verhalten, Sie müssen auch andere Browser überprüfen.

Überprüfen Sie auch dieses Google Anweisungen, half sie mir eine Menge, wenn Tuning-Caching params: http://code.google.com/speed/page-speed/docs/caching.html

+1

Dies könnte speziell für den Mac sein, aber ich sehe das definitiv sowohl in Chrome als auch in Safari. Da die meisten Schüler macs in der Schule benutzen, ist dies immer noch ein Problem, das es zu lösen gilt. – kamens

3

Da dies ein Problem mit Chrome und Safari ist, Sie HTML5 App Cache vollständig Server fordert statische Ressourcen zu verhindern nutzen könnten. Schauen Sie sich ein Beispiel an here.

+0

Wahr. Fühlt sich an wie ein bisschen mehr Arbeit, als ich tun müsste, um diese Header loszuwerden, aber das könnte eine Last-Minute-Problemumgehung sein, wenn wir uns entschließen, * dieses * Problem zu beheben. – kamens

2

Versuchen Sie zu sehen, ob das gleiche passiert, wenn Sie nicht "Enter" drücken oder aktualisieren, sondern einfach einem Link folgen. Ihr Browser tut in diesen Fällen etwas anderes. Safari führt die Anforderungen insbesondere nur so aus, wie sie ausgeführt werden sollen, wenn Sie die Aktualisierung nicht verwenden oder die Seite explizit erneut anfordern.

Sie können dies sehr einfach auf einem Mac ausprobieren. Führen Sie einen einfachen Server mit netcat (nc) auf irgendeinem Hafen, sagen wir, 9090:

nc -l 9090 

Erstellen Sie eine einfache Seite mit einem Link zu http://localhost:9090 darin, klicken Sie darauf, und beobachten Sie die Header Ihrer nc Befehl zeigt.

Geben Sie eine Antwort manuell ein, indem Sie sie in nc eingeben, z. so etwas wie

Klicken Sie erneut auf den Link und sehen Sie den Header If-None-Match in der Anfrage.Führen Sie eine Rückgabe nach der Adresse in der Adressleiste aus, und Sie werden sehen, dass Safari die Kopfzeile nicht sendet.

+0

Guter Rat. Mein Problem ist, dass das Drücken der Eingabetaste in der Adressleiste eigentlich nicht das eigentliche Problem ist (tut mir leid, dass ich das nicht gesagt habe), aber es ist der einfachste Weg, das Problem zu reproduzieren. Das eigentliche Problem besteht darin, dass wir dasselbe Verhalten sehen, wenn wir ein Formular auf "Seite A" senden und nach dem POST auf dieselbe "Seite A" weiterleiten. Wir machen viele dieser POST-Übermittlungen, und die zusätzlichen Anforderungen für alle statischen Inhalte auf "Seite A" nach jeder Weiterleitung sind unerwünscht. – kamens

+1

Ich verstehe. Kann Ihnen dann nicht helfen, ich weiß nicht über GAE Konfigurationsoptionen. –

5

Sie müssen die Header Last-Modified und ETag entfernen.

Indem Sie den ETag-Header entfernen, deaktivieren Sie Caches und Browser, um Dateien zu validieren. Daher müssen Sie sich auf Ihren Cache-Control- und Expires-Header verlassen. Entity-Tags (ETags) sind ein Mechanismus, um nach einer neueren Version einer zwischengespeicherten Datei zu suchen.

Entfernen Sie sowohl den Last-Modified- als auch den ETag-Header. Sie werden If-Modified-Since- und If-None-Match-Anfragen und ihre 304 Not Modified-Antworten vollständig eliminieren, sodass eine Datei zwischengespeichert wird, ohne nach Updates zu suchen Header gibt an, dass neuer Inhalt verfügbar ist.

Weitere Informationen hier: http://www.samaxes.com/2008/04/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/.

Leider weiß ich nicht, wie Sie sie für GAE statischen Inhalt ausschalten können.

+1

Ja, einverstanden ... Ich brauche nur mehr Kontrolle in GAE Land. Dies scheint jedoch ein relativ großer Fehler zu sein. – kamens

3

Ihr ETag-Wert ist in Ordnung. ETag erzwingt keine Revalidierung. Es ermöglicht nur, dass es zuverlässiger als das letzte Änderungsdatum ist. Ich habe gerade mit Chrome 9 zu Ihrem Beispiel für statische Inhalte geblättert und Ihre Inhalte werden zwischengespeichert und nicht unnötig erneut überprüft. Das Problem, das Sie gesehen haben, könnte damit zusammenhängen, dass Sie die Browsereinstellungen immer "erneut validieren", die für die meisten Browser nicht die Standardeinstellung sind. Es könnte sich auch um einen Mac-Webkit-Bug handeln.

+1

Ja, es passiert nur auf Mac Webkit, aber das Etag erzwingt Revalidierung in einigen Browsern und ist der Auslöser, den ich entfernen muss. – kamens

Verwandte Themen