2011-10-03 8 views
5

Chciałbym dodać łańcuch zapytania na końcu ścieżki do javascript, tak aby za każdym razem, gdy moja aplikacja jest aktualizowana do nowej wersji, pobierany jest javascript. Tak długo, jak ciąg zapytania jest taki sam, chcę, aby nadal używać wersji buforowanej bez wykonywania żądania http, aby sprawdzić, czy skrypt się zmienił.Czy Firefox buforuje javascript i używa go bez żądania, jeśli w ścieżce znajduje się zapytanie?

Sposób, w jaki robię to w PHP, to odczytanie z tagu CVS. Kiedy buduję HTML do wyjścia, czytałem tag CVS i używać, aby dołączyć do końca javascript ścieżki tak, że tworzy tagu skrypt, który wygląda tak:

<script src="javascript/messages/shipments.js?TPRSAPPS-DEV2_090828145712237-BRANCH" type="text/javascript"></script> 

Dopóki aplikacji nie uległo zmianie, tag pozostanie niezmieniony, dlatego też ciąg zapytania będzie również taki sam. Przeglądarka powinna buforować JS, a nie żądać w ogóle sieci, ponieważ data wygaśnięcia jest o wiele większa. Za każdym razem, gdy aplikacja jest aktualizowana, ciąg zapytania zmienia się, a przeglądarka powinna go pobrać.

Działa to świetnie w IE8. Mój problem dotyczy przeglądarki Firefox. Firefox buforuje pliki, ale przy następnym ładowaniu strony Firebug pokazuje odpowiedź 304, wskazując, że nadal wykonała żądanie sieciowe dla pliku, a następnie stwierdziła, że ​​nie została zmieniona.

Moje pytanie brzmi, czy Firefox ignoruje nagłówek wygasania i pamięć podręczną javascript, gdy istnieje ciąg zapytania?

Powiązane: what does firefox decide not to cache? Wygląda na to, że szyny mają coś podobnego. Ale to nie odpowiada na moje pytanie.

Oto odpowiedź wracam do tego pliku:

https://appdev.prsx.net/~jhargett/PRSApps-Motorlog/javascript/menuReader.js?TPRSAPPS-DEV2_090828145712237-BRANCH-DIFFERENT 

HTTP/1.1 304 Not Modified 
Date: Mon, 03 Oct 2011 18:35:26 GMT 
Server: Apache/2.2.3 (Red Hat) 
Connection: close 
Etag: "179010-3f8-49a9a74334200" 
Vary: Accept-Encoding 

Zakładka Cache w Firebug mówi:

Last Modified Mon Oct 03 2011 13:35:26 GMT-0500 (Central Daylight Time) 
Last Fetched Mon Oct 03 2011 13:35:26 GMT-0500 (Central Daylight Time) 
Expires Fri Oct 28 2011 18:33:31 GMT-0500 (Central Daylight Time) 
Data Size 345 
Fetch Count 12 
Device disk 
+3

Co nagłówki odpowiedzi HTTP wygląda? To jest tutaj ważne. – Pointy

+2

Wykonanie 304 jest normalne. Firefox wyśle ​​żądanie GET dla każdego zasobu na stronie co najmniej raz, z nagłówkiem "if-modified-since". Od serwera zależy odpowiedź na nową treść (200) lub niezmodyfikowaną 304. –

+0

Jeśli nagłówek wygasa, jest znacznie bardziej przyszłościowy, powinien w ogóle wykonać żądanie. –

Odpowiedz

6

logika Firefox używa się zdecydować, czy dokonać warunkowego GET otrzymał buforowane odpowiedź jest tak:

  1. Jeśli jest istotne Vary nagłówek, revalidate.
  2. Jeśli żądanie to ma zostać załadowane na siłę z pamięci podręcznej, nie powtarzaj ponownie.
  3. Jeśli to żądanie ma flagę "zawsze sprawdzaj poprawność", ponownie ją zatwierdz.
  4. Jeśli to żądanie ma flagę "nigdy nie sprawdzaj poprawności", wówczas można ją ponownie zatwierdzić tylko wtedy, gdy jest to odpowiedź typu "brak magazynu" lub "brak odpowiedzi w pamięci podręcznej" protokołu SSL.
  5. Jeśli kod stanu odpowiedzi nie jest dostępny w pamięci podręcznej lub odpowiedź nie jest przechowywana w pamięci podręcznej lub nie jest przechowywana w sklepie, lub jeśli data wygaśnięcia jest wcześniejsza niż data odpowiedzi, należy ponownie wykonać próbę.
  6. Jeśli istnieje parametr zapytania, a odpowiedź nie ma wyraźnej wartości Wygaśnięcie lub maksymalny wiek, należy ponownie zatwierdzić.
  7. Jeśli czas wygaśnięcia odpowiedzi upłynął w przeszłości, należy ponownie zatwierdzić (chyba że ustawiona jest "jedyna opcja ponownego sprawdzania raz na sesję użytkownika").

Tak więc w twoim przypadku nie powinno być warunkowego GET, zakładając, że ustawiłeś datę ważności lub informację o maksymalnym wieku dla 200 odpowiedzi.

To powiedziawszy, niektóre narzędzia, które próbują śledzić informacje HTTP dla Firefoksa, wpływają na zachowanie ponownego sprawdzania poprawności, więc możesz być na nim uruchomiony.

Zalecam utworzenie dziennika zgodnie z instrukcjami podanymi w https://developer.mozilla.org/en/HTTP_Logging, które przypadkowo dokładnie wyjaśnią, dlaczego wykonywany jest warunkowy GET, jeśli można znaleźć odpowiednią część rejestru (wyszukaj "nsHttpChannel :: CheckCache enter" dla logowanie z funkcji realizującej powyższą logikę).

+0

Znalazłem swoją odpowiedź na podstawie tej odpowiedzi i komentarza Pointy powyżej. Ponownie sprawdziłem nagłówek odpowiedzi w oryginalnym nieużywanym zbiorze (200). Nie było wyraźnego nagłówka wygasania! Mimo że zakładka Pamięć podręczna Firefoksa pokazywała datę wygaśnięcia, nie uzyskiwała tego z nagłówka HTTP. –

+1

@Jon HTTP RFC definiuje heurystykę określającą czas wygaśnięcia na podstawie bieżącego czasu i nagłówka Data. Więc tak, pojawiłeś się w punkcie 6 powyżej, który właśnie implementuje http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.9 paragraf 2. –

0

Co patrzysz jest czymś innym niż faktycznie pobieranie pliku , a następnie powiedzieć, że się nie zmieniło.

Firefox wykonuje żądanie HTTP, aby uzyskać informacje o pliku, a nie sam plik. To naprawdę oznacza, że ​​firefox robi to mądrzej, to robi IE.

Żądanie firefox ma tylko kilka bajtów (rozmiar pliku, data itd.). więc bez względu na nazwę, firefox je buforuje (chyba że jest wyłączony). Jeśli sam plik się zmieni, firefox zdecyduje się ponownie pobrać plik.

To, co wskazujesz, to właściwie zachowanie.

+0

Rozumiem, że nie pobiera on całego pliku, a jedynie sprawdza, czy jest on aktualizowany. Jednak cały sens dodania wygasłej przyszłości ([yahoo] (http://developer.yahoo.com/performance/rules.html)) polega na uniknięciu nawet żądania sieci sprawdzania tego. W rzeczywistości Firefox nie wykonuje żądania, gdy nie ma ciągu zapytania. Wyciąga z pamięci podręcznej, a Firebug pokazuje wyszarzoną linię z odpowiedzią 200, wskazując, że używał pliku z pamięci podręcznej bez żądania. –

0

Jeśli chcesz mieć absolutną pewność, że Twój plik zostanie załadowany ponownie, lepiej umieścić numer wersji/ciąg pomijania pamięci podręcznej bezpośrednio w nazwie pliku. Tak więc masz coś takiego jak shipments_v2.js lub shipments_(unix_timestamp).js. To zajmie się serwerami proxy i wszelkimi innymi mechanizmami buforowania.

+0

Dobrze, ale to wymaga skryptów kompilacji do zmień nazwę rzeczywistego pliku. Przypuszczam, że możesz również coś zrobić w pliku htaccess, aby usunąć plik _v2.js i przekierować go do poprawnego pliku. –

+0

Obie są poprawnymi uwagami.Jeśli jest to większy projekt, prawdopodobnie będzie zawierał skrypt budujący, który zminimalizuje jego zawartość, w przeciwnym razie, jeśli jest to tylko jeden plik, może to zrobić ręcznie :) – deviousdodo

0

Jak wyjaśniono w odpowiedzi Borisa, jednym z warunków wyzwalających żądanie warunkowe jest obecność nagłówka Vary. Zwykle nie chcesz ich usuwać w zależności od Accept-Encoding, ale to, co możesz zrobić i co jest dobre w przypadku, gdy masz wersję URL, to opuścić przeglądarkę, nie mając nic do przedłużenia. W twoim przypadku jest to nagłówek Etag. Może również być nagłówkiem Last-Modified. Przykładowy kod dla lakieru, aby to zrobić dla Ciebie może wyglądać następująco:

sub vcl_recv { 
    [..] 
     if (req.url ~ "\?v=\w+$") { 
      set req.http.X-Versioned = "1"; 
     } 
    [..] 
    } 

    sub vcl_deliver { 
    [..] 
     if (req.http.X-Versioned) { 
      unset resp.http.Etag; 
     } 
    [..] 
    } 
Powiązane problemy