2011-11-03 32 views
21

मेरे पास एप्लिकेशन में उपयोग किए जाने वाले फ़ोल्डर में बहुत सारी छवियां हैं। कैश मैनिफेस्ट का उपयोग करते समय यह आसान रखरखाव बुद्धिमान होगा यदि मैं एक निश्चित निर्देशिका में सभी छवियों या फ़ाइलों को कैश करने के लिए एक वाइल्ड कार्ड निर्दिष्ट कर सकता हूं।मैं निर्देशिका में सभी छवियों को लोड करने के लिए HTML5 कैश मैनिफेस्ट में वाइल्डकार्ड कैसे निर्दिष्ट करूं?

उदा।

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

क्या यह किया जा सकता है? ../img/* के साथ कुछ ब्राउज़रों में भी कोशिश की है लेकिन यह काम नहीं कर रहा है।

+0

** नोट: ** 2017 में [सेवा कर्मचारी] (https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers) एपीआई तेजी से ऐप कैश को बदल रहा है, और ब्राउज़र '.manifest' फ़ाइल को अनदेखा करना शुरू कर रहे हैं - फ़ायरफ़ॉक्स 44 कंसोल में सेवा श्रमिकों का उपयोग करने का सुझाव देता है जब इसे '.manifest' फ़ाइल मिलती है। –

उत्तर

17

मुझे नहीं लगता कि यह इस तरह से काम करता है। आपको सभी छवियों को एक-एक करके निर्दिष्ट करना होगा, या निर्देशिका के माध्यम से लूप करने के लिए एक साधारण PHP स्क्रिप्ट रखना होगा और फ़ाइल आउटपुट (सही text/cache-manifest पाठ्यक्रम के शीर्षलेख के साथ)।

+19

दरअसल, एक वाइल्डकार्ड काम करता है ** यदि ** आप निर्देशिका सूची की अनुमति देते हैं, यानी यदि आप ब्राउज़ करते हैं ... mysite.com/img/ और आपको निर्देशिका में सभी फ़ाइलों की एक सूची मिलती है। मैंने ज्यादातर दोपहर बिताए कि यह पता लगाने की कोशिश क्यों कर रहा है कि साइट मेरी विकास मशीन पर क्यों काम कर रही है (जो निर्देशिका सूची की अनुमति देता है) लेकिन मेरे परीक्षण सर्वर पर नहीं (जो लिस्टिंग की अनुमति नहीं देता है)। हालांकि, सुरक्षा कारणों से अधिकांश सर्वर निर्देशिका लिस्टिंग अक्षम करते हैं .... – JvO

+1

@JvO: दिलचस्प! मुझे नहीं पता था। क्या आप इसे शामिल करने के लिए अपना जवाब संपादित कर सकते हैं? मैं आपके सुझाए गए संपादन को स्वीकार करूंगा (आपको इससे कुछ अंक भी मिलेंगे: पी) –

21

यह आसान होगा, लेकिन यह कैसे काम करेगा? मैनिफेस्ट फ़ाइल ऐसा कुछ है जिसे ब्राउज़र में पार्स किया गया है और उस पर कार्य किया गया है, जिसमें आपके सर्वर पर फ़ाइलों के बारे में कोई विशेष जानकारी नहीं है जो आपने इसे बताया है।

../img/*.png 

पहली छवि ब्राउज़र सर्वर से अनुरोध करना चाहिए क्या है: ब्राउज़र इस देखता है? इन साथ शुरू करते हैं:

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

वाले सभी चित्र एक अंकीय नाम के साथ मौजूद हो सकता है, 231-1 पर रोक अर्द्ध मनमाने ढंग से है यही कारण है कि। आपकी img निर्देशिका में उनमें से कितनी 2 अरब फ़ाइलें मौजूद हैं? क्या आप वास्तव में एक ब्राउज़र चाहते हैं कि वे सभी अनुरोध केवल 2 अरब 404 प्राप्त करें? पूर्णता के लिए ब्राउज़र शायद यह भी सभी शून्य से भरे समकक्ष अनुरोध करना चाहते हैं:

../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 
... 

अब ब्राउज़र की बनाया से अधिक 4 अरब HTTP फ़ाइलें जो ज्यादातर नहीं हैं के लिए अनुरोध, और यह नहीं है अभी तक भी पर मिला सर्वर पर मौजूद संभावित फ़ाइल नामों को बनाने में अक्षरों या विराम चिह्नों के लिए। यह प्रकट करने के लिए मैनिफेस्ट फ़ाइल के लिए एक व्यवहार्य तरीका नहीं है। सर्वर वह है जहां img निर्देशिका में फ़ाइलें ज्ञात हैं, इसलिए यह सर्वर पर है कि फ़ाइलों की सूची का निर्माण किया जाना है।

+1

वैसे जब ब्राउज़र सर्वर के प्रारंभिक अनुरोध करता है तो यह सार्वजनिक रूप से उपलब्ध छवि निर्देशिका को देखता है और उस पर एक निर्देशिका सूची करता है निर्देशिका। वह उन फ़ाइलों की एक सूची लौटाएगा जो इसे देख सकते हैं। फिर यह ब्राउज़र/क्लाइंट को केवल एक्सटेंशन .png वाली फ़ाइलों को डाउनलोड करता है। अनुमान लगाने की कोई आवश्यकता नहीं है कि सर्वर से 0 से पूछताछ करके फ़ाइलों को क्या कहा जा सकता है - एक ट्रिलियन फ़ाइल नाम संभावनाएं। – zuallauz

+1

@zuallauz छवि निर्देशिका मानना ​​सार्वजनिक रूप से उपलब्ध है, जो वास्तव में मैंने जो कुछ कहा है उससे कुछ भी अलग नहीं कह रहा है: "सर्वर वह है जहां आईएमजी निर्देशिका में फ़ाइलें ज्ञात हैं, इसलिए यह सर्वर पर है कि फ़ाइलों की सूची का निर्माण करना है ", सिवाय इसके कि ब्राउजर के लिए सार्वजनिक रूप से उपलब्ध छवि निर्देशिका द्वारा लौटाई गई फ़ाइल लिस्टिंग के लिए कोई मानक प्रारूप नहीं है, लेकिन मैनिफेस्ट फ़ाइल के लिए एक मानक है। – robertc

+7

फ़ोल्डर/निर्देशिका सूची के बिना, आप कह सकते हैं "इस अनुरोध पर लोड की गई कोई भी फ़ाइल कैश करें और मैंने जो फ़ोल्डर निर्दिष्ट किया है उससे मेल खाता है" तो उस फ़ोल्डर में कोई भी छवि नहीं है, लेकिन पृष्ठ पर किसी भी छवि का संदर्भ दिया गया है। –

3

यदि ब्राउज़र फ़ोल्डर लिस्टिंग का अनुरोध कर सकता है तो यह एक बड़ी सुरक्षा समस्या होगी - यही कारण है कि टोमकैट अब डिफ़ॉल्ट रूप से उस क्षमता को बंद कर देता है।

लेकिन, ब्राउजर सभी मैचों को कैश किए गए पृष्ठों द्वारा संदर्भित वाइल्डकार्ड में ढूंढ सकता है। यह दृष्टिकोण अभी भी समस्याग्रस्त होगा (जैसे, छवियों के बारे में जो प्रारंभ में उपयोग नहीं किया गया है लेकिन जावास्क्रिप्ट द्वारा गतिशील रूप से सेट किया गया है, और इसकी आवश्यकता होगी कि सभी कैश किए गए आइटम न केवल डाउनलोड किए जाएंगे बल्कि साथ ही पार्स किए जाएंगे)।

2

यदि आप इसे मैन्युअल रूप से करने के बजाय स्वचालित रूप से इस प्रक्रिया को स्वचालित करने का प्रयास कर रहे हैं। एक स्क्रिप्ट का प्रयोग करें, या जैसा कि मैं करता हूं मैं manifestR का उपयोग करता हूं। यह आपकी मेनिफेस्ट/एपकेच फ़ाइल आउटपुट करेगा और आपको बस कॉपी और पेस्ट करना होगा। मैंने इसे सफलतापूर्वक उपयोग किया है और आमतौर पर केवल कुछ बदलाव करना पड़ता है।

इसके अलावा, मैं वाइल्ड कार्ड के साथ नेटवर्क हैडर उपयोग करने की अनुशंसा:

NETWORK: 
* 

यह JSON के माध्यम से अन्य लिंक किए गए डोमेन, उदाहरण के लिए, से सभी परिसंपत्तियों कैश में डाउनलोड करने के लिए अनुमति देता है। मेरा मानना ​​है कि यह एकमात्र हेडर है जहां आप वाइल्डकार्ड निर्दिष्ट कर सकते हैं। जैसा कि दूसरों ने यहां कहा है, यह सुरक्षा कारणों से है।

+3

आप ** गलत हैं ** ** नेटवर्क्स के तहत सूचीबद्ध फ़ाइलें: कैश मेनिफेस्ट फ़ाइल में सेक्शन हेडर सफेद सूचीबद्ध संसाधन हैं जिन्हें सर्वर से कनेक्शन की आवश्यकता होती है। –

0

कैश मेनिफेस्ट अब बहिष्कृत है और आपको कैशिंग को नियंत्रित करने के लिए HTML शीर्षलेखों का उपयोग करना चाहिए।

उदाहरण के लिए:

<meta http-equiv="Cache-control" content="public"> 
  • सार्वजनिक - सार्वजनिक साझा कैश में कैश की जा सकती।
  • निजी - केवल निजी कैश में कैश किया जा सकता है।
  • नो-कैश - कैश नहीं किया जा सकता है।
  • नो-स्टोर - कैश किया जा सकता है लेकिन संग्रहीत नहीं किया जा सकता है।