Próbuję zachować podstawowe zachowanie dotyczące mojej strategii buforowania: pliki powinny być buforowane i każdorazowo ponownie sprawdzane na serwerze. Chciałbym więc, aby Apache odesłał 304.
Oto okno dialogowe, które pojawia się przy każdym odświeżeniu przeglądarki:
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Response Headers
Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding
(pochodzi z devtools chrome, bez zaznaczonej opcji Wyłącz pamięć podręczną)
Widać, że odpowiedź zawiera nagłówek Cache-Control: No-cache Header oraz że nagłówek If-Modified-Since pasuje do ostatniej modyfikacji. ETag również pasuje.
Czy w takim przypadku Apache nie powinien wysłać 304?
EDYTOWAĆ
Wyłączanie ETagów w apache za pomocą
Header unset ETag
sprawia, że zachowanie buforowania jest bardziej przewidywalne ...
Cache-Control:max-age=0
wyłączyłem pamięć podręczną, więc widziszCache-Control:No-cache
odpowiedź.Odpowiedzi:
To wydaje się być starym błędem , wyjaśniającym, dlaczego
Header unset ETag
robi różnicę.Apache 2.4.0+ automatycznie dołącza nazwę metody kompresji do ETag (jak widać w nagłówkach) i zapobiega odpowiedzi 304.
Najnowsze wersje mod_deflate obsługują DeflateAlterETag, którego można użyć do kontrolowania tego zachowania:
źródło
DeflateAlterETag Remove
opcjęTen wyróżnia się w żądaniu jako nieco dziwny:
Prawdopodobnie ważniejsze jest jednak to, że zwracana zawartość to html. Czy jest generowany dynamicznie? Apache MOŻE wysłać odpowiedź 304, ale jeśli nie podajesz treści statycznych, wykonywanie tego połączenia nie jest zadaniem Apache i sprowadza się to do logiki aplikacji. Np. Większość aplikacji php ma ograniczone wsparcie dla takich rzeczy.
Pomocna może być pamięć podręczna frontonu, ponieważ aplikacja buforująca może sprawdzić czas modyfikacji, etag itp., Ale tylko wtedy, gdy zarówno aplikacja, jak i nagłówki żądania są przyjazne dla pamięci podręcznej. Na przykład aplikacja musi ustawić odpowiednie nagłówki, aby wskazać, że zawartość jest buforowalna, a takie elementy, jak nagłówek kontroli pamięci podręcznej w żądaniu, spowodują zanegowanie pamięci podręcznej. Twoje nagłówki nie wyglądają na przyjazne dla pamięci podręcznej.
źródło
Jeśli masz skonfigurowanego Apache
Cache-Control:No-cache
, Apache nigdy nie wyśleHTTP 304 Not modified
do klienta.Jeśli chcesz ponownie zweryfikować niektóre żądania, umieść je
Cache-Control:No-cache
tylko na stronach, na których jest to potrzebne. Nie musisz ponownie sprawdzać poprawności wszystkich zasobów i marnujesz w ten sposób przepustowość.źródło