2011-11-03 12 views
21

Mam wiele zdjęć w folderze, które są używane w aplikacji. Podczas używania manifestu pamięci podręcznej łatwiej byłoby zachować ostrożność, gdybym mógł określić kartę wieloznaczną, aby załadować wszystkie obrazy lub pliki w określonym katalogu, który będzie buforowany.Jak określić symbol wieloznaczny w manifeście podręcznym HTML5, aby załadować wszystkie obrazy do katalogu?

E.g.

CACHE MANIFEST 
# 2011-11-3-v0.1.8 
#-------------------------------- 
# Pages 
#-------------------------------- 
../index.html 
../edit.html 
#-------------------------------- 
# JavaScript 
#-------------------------------- 
../js/jquery.js 
../js/main.js 
#-------------------------------- 
# Images 
#-------------------------------- 
../img/*.png 

Czy można to zrobić? Wypróbowałem go również w kilku przeglądarkach z ../img/*, ale wydaje się, że nie działa.

+0

** UWAGA: ** w 2017 roku interfejs API [Service Worker] (https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers) szybko zastępuje AppCache, a przeglądarki zaczynają ignorować plik '.manifest' - Firefox 44 sugeruje nawet użycie Service workers zamiast w konsoli, kiedy znajdzie plik' .manifest'. –

Odpowiedz

17

Nie sądzę, że to działa w ten sposób. Będziesz musiał określić wszystkie obrazy jeden po drugim lub mieć prosty skrypt PHP, który przejrzy katalog i wypisze plik (oczywiście z poprawnym nagłówkiem text/cache-manifest).

+19

W rzeczywistości symbol wieloznaczny działa **, jeśli ** zezwalasz na wyświetlanie katalogów, to znaczy, gdy przeglądasz ... mysite.com/img/ i dostajesz listę wszystkich plików w katalogu. Spędziłem większość popołudnia próbując dowiedzieć się, dlaczego strona działa na moim komputerze programistycznym (który pozwala na wyświetlanie katalogów), ale nie na moim serwerze testowym (który nie zezwala na aukcje). Jednak ze względów bezpieczeństwa większość serwerów wyłącza listy katalogów .... – JvO

+1

@JvO: Interesujące! Nie wiedziałem. Czy mógłbyś edytować moją odpowiedź, aby to uwzględnić? Przyjmuję twoją sugerowaną edycję (otrzymasz od niej również kilka punktów: P) –

21

Byłoby łatwiej, ale jak to zadziała? Plik manifestu jest czymś, co jest przetwarzane i obsługiwane w przeglądarce, która nie ma specjalnej wiedzy o plikach na twoim serwerze, poza tym, co mu powiedziałeś. Jeśli przeglądarka widzi to:

../img/*.png 

Jaki jest pierwszy obraz, który przeglądarka powinna zażądać od serwera? Zacznijmy od tych:

../img/1.png 
../img/2.png 
../img/3.png 
../img/4.png 
... 
../img/2147483647.png 

to wszystkie obrazy, które mogą występować z nazwą numeryczną, zatrzymując się w pół-arbitralnie 231-1. Ile z tych 2 miliardów plików istnieje w twoim katalogu img? Czy naprawdę chcesz, aby przeglądarka wysyłała wszystkie te żądania tylko po to, aby uzyskać 2 miliardy 404? Dla kompletności przeglądarka prawdopodobnie również chcesz zwrócić wszystkie zera wypełnionych odpowiedniki:

../img/01.png 
../img/02.png 
../img/03.png 
../img/04.png 
... 
../img/001.png 
../img/002.png 
../img/003.png 
../img/004.png 
... 
../img/0001.png 
../img/0002.png 
../img/0003.png 
../img/0004.png 
... 

Teraz wykonanych ponad 4 miliardy żądań HTTP przeglądarki dla plików, które najczęściej nie istnieją, a to jeszcze nie dostałem nawet na na litery lub znaki interpunkcyjne w konstruowaniu możliwych nazw plików, które mogą istnieć na serwerze. Nie jest to realistyczny sposób działania pliku manifestu. Serwer znajduje się tam, gdzie pliki w katalogu img są znane, więc na serwerze musi zostać zbudowana lista plików.

+1

Cóż, kiedy przeglądarka wykonuje początkowe żądanie do serwera, po prostu patrzy na publicznie dostępny katalog obrazów i robi listę katalogów na tym informator. To zwróci listę plików, które może zobaczyć. Następnie pobiera do przeglądarki/klienta tylko pliki z rozszerzeniem .png. Nie ma potrzeby odgadywania, jakie pliki można wywołać, wysyłając zapytanie do serwera z 0 - trylion plików. – zuallauz

+1

@zuallauz Założenie, że katalog obrazów jest publicznie dostępny, nie mówi nic innego niż to, co powiedziałem: "Serwer jest tam, gdzie pliki w katalogu img są znane, więc na serwerze musi być zbudowana lista plików ", z wyjątkiem tego, że nie ma standardowego formatu dla listy plików zwróconej przez publicznie dostępny katalog obrazów, który przeglądarka ma analizować, ale istnieje standard dla pliku manifestu. – robertc

+7

Bez wykazu folderów/katalogów, możesz powiedzieć "cache" dowolny plik, który został załadowany na to żądanie i pasuje do folderu, który określiłem " Więc nie obraz w tym folderze, ale jakikolwiek obraz, do którego odnosi się strona. –

3

Byłby to duży problem z bezpieczeństwem, gdyby przeglądarki mogły żądać listy folderów - właśnie dlatego Tomcat domyślnie wyłącza tę funkcję.

Jednak przeglądarka może zlokalizować wszystkie dopasowania do symboli wieloznacznych, do których odwołują się strony, które znajdują się w pamięci podręcznej. Takie podejście będzie nadal problematyczne (np. Co do obrazów nieużywanych początkowo, ale ustawianych dynamicznie przez JavaScript itd.) I wymagałoby, aby wszystkie elementy z pamięci podręcznej były pobierane nie tylko, ale również analizowane).

2

Jeśli próbujesz zautomatyzować ten proces, zamiast ręcznie to zrobić. Użyj skryptu lub tak jak ja używam manifestR. Wypisze plik manifestu/appcache, a wszystko, co musisz zrobić, to skopiować i wkleić. Użyłem go z powodzeniem i zwykle muszę tylko wprowadzić kilka zmian.

Również polecam przy użyciu nagłówka sieci z dziką kartą:

NETWORK: 
* 

Dzięki temu wszystkie aktywa z innych domen powiązanych pośrednictwem JSON, na przykład, aby pobrać do pamięci podręcznej. Uważam, że jest to jedyny nagłówek, w którym można określić symbol wieloznaczny. Tak jak mówili tu inni, to ze względów bezpieczeństwa.

+3

Jesteś ** Wrong! ** Pliki wymienione pod nagłówkiem NETWORK: section w pliku manifestu pamięci podręcznej to zasoby umieszczone na białej liście, które wymagają połączenia z serwerem. –

0

Manifest pamięci podręcznej jest teraz przestarzały i do kontrolowania buforowania należy używać nagłówków HTML.

Na przykład:

<meta http-equiv="Cache-control" content="public"> 
  • publiczny - mogą być przechowywane w pomieszczeniach udostępnionych skrytek.
  • Prywatne - może być buforowane tylko w prywatnej pamięci podręcznej.
  • Brak bufora - nie można buforować.
  • No-Store - może być buforowany, ale nie zarchiwizowany.
Powiązane problemy