2015-05-12 10 views
7

Próbuję przetestować jakąś konfigurację buforowania, chcę moją stronę pozostać w pamięci podręcznej przez 1 minutę, zanim dotrze do serwera żądanie ponownie.Przeglądarki zdają się ignorować instrukcji odpowiedź Cache-Control

Stosując tę ​​prostą stronę Test.asp że ma link do siebie:

<% Option Explicit %> 
<% 
    Response.Expires = 1 
    Response.CacheControl = "private, max-age=60" 
%> 
<html> 
<head><title>test</title></head> 
<body> 
<% =Now() %> 
<br /> 
<a href="test.asp">test</a> 
</body> 
</html> 

Działa to doskonale na moim komputerze rozwoju http://localhost/test.asp (kliknięcie linku nie odświeżyć wydrukowany datetime w ciągu 1 min).

Jednak nie pożądany efekt, kiedy umieścić stronę na serwerze produkcyjnym. Po kilku sekundach kliknięcia linku otrzymuję nowy datetime, co oznacza, że ​​żądanie dotarło do serwera WWW.

używam narzędzia dev Chrome i zobaczyć te nagłówki odpowiedzi:

HTTP/1.1 200 OK 
Cache-Control: private, max-age=60 
Content-Type: text/html 
Expires: Tue, 12 May 2015 19:16:52 GMT 
Last-Modified: Tue, 12 May 2015 19:10:00 GMT 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Tue, 12 May 2015 19:15:55 GMT 
Content-Length: 205 

Czy ktoś może pomóc wyjaśnić, dlaczego to nie działa na serwerze prod?

aktualizacja Próbowałem z Chrome, Firefox i IE, a także 2 stron Test.asp i test2.asp, zarówno o link do innej strony, i dostaliśmy dokładnie ten sam problem, po 8-12 sek , strona odświeża się zamiast czekać 60 sekund przed odświeżeniem.

+0

Jak testujesz? Odśwież w tej samej karcie? Może to być problem z chromem: http://stackoverflow.com/questions/11245767/is-chrome-ignoring-control-cache-max-age Przyczyną działania w środowisku deweloperów może być to, że Chrome wykonuje fajne rzeczy z W każdym razie URL "localhost". – AardVark71

+0

Testuję klikając hiperłącze na stronie testowej, która łączy się z samym sobą. Użycie przycisku odświeżania zawsze wysyła żądanie do serwera, który jest logiczny. Spróbuję z innymi przeglądarkami, a także może z więcej niż jedną stroną. – Jonathan

+0

Świetnie! teraz, kiedy właśnie rozpocząłem nagrodę i spróbowałem ponownie tego samego kodu, problem zniknął w magiczny sposób, co do cholery: | – Jonathan

Odpowiedz

0

Aby śledzić w moim komentarzu, Wygląda na to może być patrząc na buforowanie dynamicznych stron ASP na serwerze, a nie na kliencie. Buforowanie na kliencie tak naprawdę nie działa zbyt dobrze, ponieważ nowoczesne przeglądarki/proxy nadal będą żądać tego elementu, gdy jest dokumentem HTML. Buforowanie statycznych zasobów, które nie zmienia się, takich jak obrazy, css, js powinno działać, i w zależności od nagłówka pamięci podręcznej, który wypychasz, przeglądarka będzie je respektować.

Aby Twoje strony w pamięci podręcznej na serwerze (czyli IIS robi się do ponownego generowania strony) oto jak to zrobić.

Web.config

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <caching> 
      <profiles> 
       <add extension=".asp" policy="CacheForTimePeriod" kernelCachePolicy="DontCache" duration="00:01:00" /> 
      </profiles> 
     </caching> 
    </system.webServer> 
</configuration> 

Można postawić web.config w określonym katalogu pamięci podręcznej tylko jego zawartość, można również przerwać buforowania przy użyciu kwerendy params lub niektórych nagłówków żądania.

+0

Nie mogę łatwo użyć buforowania danych wyjściowych IIS, ponieważ jest prywatnym buforowaniem (zawartość strony jest różna dla każdego użytkownika). Powiedziałeś: "Buforowanie na kliencie nie przynosi ci naprawdę wiele dobrego, ponieważ nowoczesne przeglądarki/proxy wciąż będą żądać tego elementu, gdy jego dokument HTML" Czy możesz wyjaśnić więcej? Dlaczego przeglądarki powinny prosić o serwer, jeśli nagłówki odpowiedzi buforowania klienta są ustawione prawidłowo? – Jonathan

+0

Można użyć buforowania wyjść iis i zmieniać parametry, można również zmieniać wartości różnych nagłówków, które można wysyłać w skryptach asp, lub można zmieniać w zależności od adresu IP. Ale jeśli twoje strony są bardzo różne, to wyjściowe buforowanie w IIS będzie pochłaniało zasoby, ponieważ będziesz mieć zbyt wiele wersji każdej strony w pamięci> Jeśli chodzi o mój poprzedni komentarz, jedyny czas, kiedy otrzymam odpowiedź z pamięci podręcznej to dla elementów statycznych (obrazy, js, css). W przypadku treści typu html chrome wydaje się zawsze żądać strony. Nie wiem dlaczego, mam takie samo zachowanie na Nginx i IIS – Frank

Powiązane problemy