Warum sendet der Browser keinen Header "If-None-Match"?

7

Ich versuche, ein dynamisch geladenes Bild in PHP herunterzuladen (und hoffentlich zwischenzuspeichern). Hier sind die Header gesendet und empfangen:

Anfrage:

%Vor%

Antwort:

%Vor%

Wenn ich die URL neu lade, werden genau dieselben Header gesendet und empfangen. Meine Frage ist, was ich in meiner Antwort senden sollte, um den Header If-None-Match in der konsequenten Anfrage zu sehen?

HINWEIS: Ich glaube, dass diese Header vor nicht allzu langer Zeit gut waren, obwohl ich nicht sicher sein kann, aber ich denke Browser werden geändert, um den Header If-None-Match nicht mehr zu senden (ich sah diesen Header). Ich teste mit Chrome und Firefox und beide können die Kopfzeile nicht senden.

    
Mehran 09.04.2013, 11:23
quelle

3 Antworten

12

Sie sagen Cache-Control: no-store, no-cache - aber Caching wird erwartet?

Entferne diese Werte (ich denke, must-revalidate, post-check=0, pre-check=0 könnte / sollte beibehalten werden - sie sagen dem Browser, dass er sich mit dem Server erkundigen soll, falls es eine Änderung gab).

Und ich würde bei Last-Modified allein bleiben (wenn die Änderungen an Ihren Ressourcen nur anhand dieses Kriteriums erkannt werden können) - ETag ist komplizierter zu handhaben (besonders wenn Sie in Ihrem PHP damit umgehen wollen) Skript selbst), und Google PageSpeed ​​/ YSlow raten davon ab.

    
CBroe 09.04.2013, 13:19
quelle
19
___ qstnhdr ___ Warum sendet der Browser keinen Header "If-None-Match"? ___ qstntxt ___

Ich versuche, ein dynamisch geladenes Bild in PHP herunterzuladen (und hoffentlich zwischenzuspeichern). Hier sind die Header gesendet und empfangen:

Anfrage:

%Vor%

Antwort:

%Vor%

Wenn ich die URL neu lade, werden genau dieselben Header gesendet und empfangen. Meine Frage ist, was ich in meiner Antwort senden sollte, um den Header If-None-Match in der konsequenten Anfrage zu sehen?

HINWEIS: Ich glaube, dass diese Header vor nicht allzu langer Zeit gut waren, obwohl ich nicht sicher sein kann, aber ich denke Browser werden geändert, um den Header If-None-Match nicht mehr zu senden (ich sah diesen Header). Ich teste mit Chrome und Firefox und beide können die Kopfzeile nicht senden.

    
___ tag123browsercache ___ Browser-Caches sind eine Instanz des Optimierungsmechanismus, der als Cache bekannt ist. Es gibt eine HTML5-Spezifikation für einen Browser-Cache-Mechanismus namens Appcache. ___ tag123httpheaders ___ Im Hypertext Transfer Protocol (HTTP) enthalten HTTP-Header-Felder die Betriebsparameter einer HTTP-Anfrage oder -Antwort. Mit der Anfrage- oder Antwortzeile (erste Zeile der Nachricht) bilden sie den Nachrichtenkopf. ___ answer15903069 ___

Sie sagen ETag - aber Caching wird erwartet?

Entferne diese Werte (ich denke, Last-Modified könnte / sollte beibehalten werden - sie sagen dem Browser, dass er sich mit dem Server erkundigen soll, falls es eine Änderung gab).

Und ich würde bei If-None-Match allein bleiben (wenn die Änderungen an Ihren Ressourcen nur anhand dieses Kriteriums erkannt werden können) - ETag ist komplizierter zu handhaben (besonders wenn Sie in Ihrem PHP damit umgehen wollen) Skript selbst), und Google PageSpeed ​​/ YSlow raten davon ab.

    
___ answer46332116 ___

Ähnliches Problem

Ich habe versucht, Conditional GET-Anfrage mit% Co_de% Header zu erhalten, die richtige% Co_de% Header geliefert, aber ohne Erfolg in jedem Browser ich versuchte.

Nach vielen Versuchen stelle ich fest, dass Browser sowohl If-None-Match als auch ETag mit demselben Pfad behandeln wie ein gleicher Cache-Kandidat. Somit wurde ETag mit korrektem header_remove() effektiv mit sofortigem "POST" auf den gleichen Pfad mit var_dump(headers_list()); abgebrochen, obwohl es von header_remove(); geliefert wurde.

Ich hoffe, dass dies für jemanden hilfreich sein könnte.

    
___ answer31904501 ___

Gleiches Problem, ähnliche Lösung

Ich habe versucht herauszufinden, warum Google Chrome beim Besuch einer Website, die ich gerade entwickle, keine ETag -Kopfzeilen sendet. (Chrome 46.0.2490.71 m, obwohl ich nicht sicher bin, wie relevant die Version ist.)

Dies ist eine andere - wenn auch sehr ähnliche - Antwort als das letztlich zitierte OP (in einem Kommentar zur angenommenen Antwort), aber es behandelt das gleiche Problem:

Der Browser sendet den Header Content-type nicht in nachfolgenden Anfragen "wenn es sein sollte" (dh serverseitige Logik über PHP oder Ähnliches) wurde verwendet, um einen Header Content-type oder ETag in den zu senden erste Antwort).

Voraussetzungen

Wenn Sie ein selbstsigniertes TLS-Zertifikat verwenden, mit dem die Sperre in Chrome rot wird, ändert sich das Cache-Verhalten von Chrome. Bevor Sie versuchen, ein Problem dieser Art zu beheben, installieren Sie das selbstsignierte Zertifikat im effektiven vertrauenswürdigen Stammspeicher und starten Sie den Browser vollständig neu, wie in erklärt Ссылка .

1. Epiphanie: If-None-Match benötigt zuerst einen ETag vom Server

Ich habe ziemlich schnell gemerkt, dass Chrome (und wahrscheinlich die meisten oder alle anderen Browser) erst dann einen ETag -Header senden, wenn der Server hat bereits gesendet ein ETag Header als Antwort auf eine vorherige Anfrage. Logischerweise macht das vollkommenen Sinn; Wie könnte Chrome schließlich ETag senden, wenn ihm nie der Wert zugewiesen wurde?

Dies führte mich dazu, meine serverseitige Logik zu betrachten - insbesondere, wie Header gesendet werden, wenn der User-Agent die Antwort zwischenspeichern soll - um zu ermitteln, aus welchem ​​Grund der Header ETag nicht gesendet wird als Reaktion auf die allererste Anfrage von Chrome für die Ressource. Ich hatte eine berechnete Bemühung gemacht, den Header ETag in meine Anwendungslogik aufzunehmen.

Ich benutze PHP, daher ist der Kommentar von @ Mehran (der OP) auf mich gesprungen (er / sie sagt, dass das Aufrufen von Ctrl+F5 vor dem Senden der gewünschten cache-bezogenen Header das Problem löst).

Ehrlich gesagt, war ich skeptisch gegenüber dieser Lösung, weil a) ich ziemlich sicher war, dass PHP standardmäßig keine eigenen Header senden würde (und dies ist bei meiner Konfiguration nicht der Fall); und b) als ich 200 OK aufgerufen habe, kurz bevor ich meine benutzerdefinierten Caching-Header in PHP gesetzt habe, war der einzige Headersatz derjenige, den ich absichtlich genau oben gesetzt habe:

%Vor%

Um nichts zu verlieren, habe ich versucht, kurz vor dem Senden meiner benutzerdefinierten Header F5 aufzurufen. Und zu meiner Überraschung hat PHP plötzlich den Header 304 Not Modified gesendet!

2. Epiphany: Gzipping der Antwort ändert ihren Hash

Es traf mich dann wie eine Tüte Ziegel: Indem ich den Header 200 OK (from cache) in PHP angab, teilte ich NGINX (dem Webserver, den ich benutze) GZIP mit, sobald PHP es zurück an NGINX übergibt! Um es klar zu stellen, die Cache-Control: no-cache , die ich angegeben habe, war auf NGINX's Liste von Typen zu gzip.

Aus Gründen der Vollständigkeit sind meine NGINX GZIP-Einstellungen wie folgt und PHP ist über php-fpm mit NGINX verbunden:

%Vor%

Ich habe darüber nachgedacht, warum NGINX die Pragma: no-cache , die ich in PHP gesendet habe, entfernen könnte, wenn ein "gzip-fähiger" Inhaltstyp angegeben wurde, und kam zu einer jetzt offensichtlichen Antwort: weil NGINX den Antwortkörper modifiziert, den PHP zurückgibt wenn NGINX es gzips! Das macht durchaus Sinn. Es macht keinen Sinn, das 200 OK (from cache) zu senden, wenn es nicht mit der Antwort übereinstimmen wird, die zum Generieren verwendet wurde. Es ist ziemlich glatt, dass NGINX dieses Szenario so intelligent handhabt.

Ich weiß nicht, ob NGINX schon immer schlau genug war, Antwortstellen zu komprimieren, die unkomprimiert sind, aber %code% headers enthalten, aber das scheint hier zu geschehen.

Also, was ist die Lösung?

Also, was ist die Lösung, um %code% zurück in die Antwort zu bekommen? Führe das Gzipping in PHP durch, so dass NGINX sieht, dass die Antwort bereits komprimiert ist, und einfach weiterleitet, während der Header %code% intakt bleibt:

%Vor%

Nachdem ich diesen Aufruf vor dem Senden der Header und des Antworthauptteils hinzugefügt hatte, begann PHP, den %code% -Wert mit jeder Antwort zu senden. Ja!

Andere gelernte Lektionen

Hier sind einige interessante Leckerbissen aus meiner Forschung. Diese Informationen sind ziemlich praktisch, wenn Sie versuchen, eine serverseitige Caching-Implementierung zu testen, sei es in PHP oder in einer anderen Sprache.

Chrome und sein Developer Tools "Net" -Bereich verhalten sich anders als , je nachdem, wie die Anfrage initiiert wird .

Wenn die Anfrage "frisch" ist, indem Sie %code% drücken, sendet Chrome diese Header:

%Vor%

und der Server antwortet %code% .

Wenn die Anfrage nur mit %code% erfolgt, sendet Chrome diese Header:

%Vor%

und der Server antwortet %code% .

Wenn die Anfrage schließlich durch Klicken auf einen Link zu der Seite erfolgt, die Sie bereits sehen, oder in die Adressleiste von Chrome und drücken Sie die Eingabetaste, sendet Chrome diese Kopfzeilen:

%Vor%

und der Server antwortet %code% .

Obwohl dieses Verhalten anfangs etwas verwirrend ist, wenn Sie nicht wissen, wie es funktioniert, ist es ein ideales Verhalten, da es jedes mögliche Anfrage- / Antwortszenario sehr gründlich testen kann.

Am verwirrendsten ist es, dass Chrome automatisch die Header %code% und %code% in die ausgehende Anfrage einfügt , wenn tatsächlich Chrome die Antworten aus seinem Cache erfasst (wie in %code% Antwort).

Diese Erfahrung war für mich eher informativ und ich hoffe, dass andere diese Wertanalyse in der Zukunft finden.

    
___ tag123cachecontrol ___ Der HTTP-Cache-Control-Header gibt Direktiven an, die das standardmäßige HTTP-Caching-Verhalten überschreiben. ___
Ben Johnson 17.10.2015 18:57
quelle
0

Ähnliches Problem

Ich habe versucht, Conditional GET-Anfrage mit% Co_de% Header zu erhalten, die richtige% Co_de% Header geliefert, aber ohne Erfolg in jedem Browser ich versuchte.

Nach vielen Versuchen stelle ich fest, dass Browser sowohl If-None-Match als auch Etag mit demselben Pfad behandeln wie ein gleicher Cache-Kandidat. Somit wurde GET mit korrektem POST effektiv mit sofortigem "POST" auf den gleichen Pfad mit GET abgebrochen, obwohl es von Etag geliefert wurde.

Ich hoffe, dass dies für jemanden hilfreich sein könnte.

    
PF4Public 20.09.2017 21:36
quelle