2009-01-15 18 views
40

के साथ वेबसाइट छवि कैशिंग मैं अपाचे पर {ब्राउज़र द्वारा कैश किया गया} और {हर अनुरोध के साथ {ताजगी के लिए जाँच की गई}} पर स्थिर सामग्री कैसे प्राप्त कर सकता हूं?अपाचे

मैं अपाचे वेबसर्वर पर होस्ट की गई वेबसाइट पर काम कर रहा हूं। हाल ही में, मैं हेडर के साथ कुछ परीक्षण कर रहा था (विभिन्न प्रकार की सामग्री के लिए सामग्री-प्रकार) और छवियों के लिए बहुत सशर्त अनुरोध देखा। उदाहरण:

200 /index.php?page=1234&action=list 
304 /favicon.ico 
304 /img/logo.png 
304 /img/arrow.png 
(etc.) 

हालांकि छवि फ़ाइलों को स्थिर सामग्री रहे हैं और ब्राउज़र द्वारा कैश कर रहे हैं, हर बार एक उपयोगकर्ता एक पृष्ठ है कि उन्हें करने के लिए लिंक को खोलता है, वे सशर्त अनुरोध कर रहे हैं, जो करने के लिए वे भेजें "304 संशोधित नहीं"। यह अच्छा है (कम डेटा स्थानांतरित), लेकिन इसका मतलब है कि प्रत्येक पृष्ठ लोड के साथ 20+ अधिक अनुरोध (उन सभी राउंड-ट्रिप के कारण लंबे समय तक लोड लोड, यहां तक ​​कि Keep-Alive और pipelining सक्षम भी)।

मैं ब्राउज़र को मौजूदा फ़ाइल रखने और नए संस्करण की जांच करने के लिए कैसे कहूं?

संपादित करें: mod_expires विधि फ़ेविकॉन के साथ भी काम करता है।

उत्तर

52

Expires अपाचे में मॉड्यूल इसे हल करता है - इसे सर्वर कॉन्फ़िगरेशन में लोड करने की आवश्यकता है, और .htaccess (या सर्वर कॉन्फ़िगरेशन में) में स्थापित होना आवश्यक है।

Expires शीर्षलेख के साथ, संसाधन केवल पहली बार अनुरोध किया जाता है। समाप्ति तिथि से पहले, ब्राउज़र के कैश से बाद के अनुरोध पूरे किए गए हैं। निर्दिष्ट समय समाप्त होने के बाद और संसाधन की आवश्यकता होती है, केवल तभी अनुरोध किया जाता है (सशर्त रूप से - एक अपरिवर्तित संसाधन के लिए 304 वापस कर दिया जाएगा)। इसे समाप्त होने से पहले कैश से साफ़ करने का एकमात्र विश्वसनीय तरीका मैन्युअल रूप से या रीफ्रेश (आमतौर पर Ctrl-F5) को मजबूर कर रहा है। (यह एक मुद्दा है, तो संसाधन इस बीच में बदलता है हो सकता है, लेकिन स्थैतिक छवियों जल्दी-जल्दी बदलती नहीं है।)

# enable the directives - assuming they're not enabled globally 
ExpiresActive on 

# send an Expires: header for each of these mimetypes (as defined by server) 
ExpiresByType image/png "access plus 1 month" 
ExpiresByType image/gif "access plus 1 month" 
ExpiresByType image/jpeg "access plus 1 month" 

# css may change a bit sometimes, so define shorter expiration 
ExpiresByType text/css "access plus 1 days" 

favicon.ico के लिए, एक थोड़ा और अधिक काम की जरूरत है (अपाचे सामान्य रूप से विंडोज को नहीं पहचानता है आइकन फ़ाइलें, और इसे डिफ़ॉल्ट पाठ/सादा के रूप में भेजती है)।

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon 
AddType image/vnd.microsoft.icon .ico 
# now we have icon MIME type, we can use it 
# my favicon doesn't change much 
ExpiresByType image/vnd.microsoft.icon "access plus 3 months" 

और वॉयला, यह वर्क्स ™!

+1

मैं अपने फ़ेविकॉन निर्दिष्ट किया है "छवि/x-आइकन" का एक MIME प्रकार के लिए - और मैं अपाचे प्राप्त करने के लिए सेट करने के लिए उस पर हेडर समय-सीमा समाप्त नहीं कर पा रहे। कोई विचार यह क्यों है? क्या मुझे छवि/vnd.microsoft.icon का उपयोग करने की आवश्यकता है? – Tom

+1

@ टॉम: "आईआईसीए फाइलों के लिए आधिकारिक आईएएनए-पंजीकृत एमआईएमई प्रकार छवि/vnd.microsoft.icon है।" (विकिपीडिया) तो, आपको इसका उपयोग करने की आवश्यकता नहीं है, लेकिन यह सही एमआईएम प्रकार है - क्या आप मानक "छवि/जेपीईजी" के बजाय जेपीईजी छवियों के साथ "छवि/एक्स-जेपीजी" भेज देंगे? क्या कोई तकनीकी कारण है कि आप सही एमआईएम प्रकार वापस नहीं करना चाहते हैं? – Piskvor

+1

@ टॉम: पहले प्रश्न के रूप में, सर्वर को ध्यान नहीं देना चाहिए कि एमआईएमई प्रकार क्या है, जब तक कि यह इसके बारे में जानता हो। क्या आपके पास इस MIME प्रकार के लिए * ExpiresByType से पहले AddType * है? – Piskvor

3

यदि आप अपनी स्थिर छवियों के लिए अपनी http प्रतिक्रिया पर Expires शीर्षलेख सेट करते हैं, तो निर्दिष्ट समय बीत जाने तक आपके सर्वर को पहले डाउनलोड के बाद फिर से उस छवि के लिए फिर से जांच नहीं की जाएगी, उदा। अगर मैं अपने सर्वर से फ़ाइल डाउनलोड अब बस इतना ही Expires के रूप में शीर्ष लेख

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

तो अपने ब्राउज़र इसके लिए अपने सर्वर से फिर से 2010 तक लग नहीं होगा, जब तक कि मैं अपने कैश को साफ़/एक शक्ति ताज़ा कर देता है (Ctrl विंडोज़ पर + एफ 5)।

इस अप here स्थापित करने के लिए एक सरल परिचय, और favicon.ico के बारे में wikipedia

2

पर अन्य संभवतः उपयोगी प्रतिक्रियाओं से अधिक की एक सूची है, तो आपके सर्वर दस्तावेज़ जड़ में रख कहना/var/www/html और जोड़ने इस उपनाम खंड में /etc/httpd/conf/httpd.conf लिए: -

Alias /favicon.ico "/var/www/html/favicon.ico" 
<Directory "/var/www/html"> 
    <Files favicon.ico> 
     ExpiresActive On 
     ExpiresDefault "access plus 1 month" 
    </Files> 
</Directory> 

तो एक भी favicon.ico के बाद आप इसे aliasing कर रहे हैं सब आभासी होस्ट की गई साइटों के लिए काम करेंगे। उपयोगकर्ता द्वारा आपकी साइट पर जाने के बाद, कोई भी विज़िट ब्राउज़र कैश प्रतिलिपि पर एक महीने के लिए खींची जाएगी, न कि वेब से।

मैं

ExpiresByType image/ico "access plus 1 month" 

बिल्कुल काम करने के लिए मिलता नहीं कर सका। शायद ऊपर दिए गए अनुसार टेक्स्ट/सादा टाइप करना होगा। किसी भी मामले में ExpiresDefault ठीक काम करता है।

+0

वैश्विक फेविकॉन के बारे में अच्छा बिंदु, यदि आपको कोई बात नहीं है कि सभी साइटें एक ही साझा की जाएंगी। मेरा उत्तर पुनः 'छवि/ico' देखें: 1) 'छवि/ico' सही एमआईएम प्रकार नहीं है, 2) आपको' image/vnd.microsoft.icon' को परिभाषित करने की आवश्यकता है - यह अपाचे द्वारा पूर्वनिर्धारित नहीं है। – Piskvor

22
filesMatch निर्देश के साथ

, बजाय ExpiresByType, आप मिलान subtype (जैसे image/*) द्वारा समूह Content-Type कर सकते हैं, बजाय प्रत्येक type/subtype जोड़ी लिस्टिंग की, नहीं subtype (उदाहरण, image/jpeg, image/png)।

#Set caching on image files for 11 months 
<filesMatch "\.(ico|gif|jpg|png)$"> 
    ExpiresActive On 
    ExpiresDefault "access plus 11 month" 
    Header append Cache-Control "public" 
</filesMatch> 

this Google article के लिए acoording मैं समाप्ति 1 वर्ष (access plus 11 month) से अधिक समय तक नहीं की और Firefox के लिए HTTPS कैशिंग को सक्षम करने Cache-Control "public" गयी।

सीएसएस और जेएस के लिए, Google 1 सप्ताह की समाप्ति अवधि की सिफारिश करता है।

<filesMatch "\.(css|js)$"> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 week" 
    Header append Cache-Control "public" 
</filesMatch> 
+1

मुझे यह जवाब बहुत पसंद है। साझा करने के लिए धन्यवाद! – KyleFarris

+0

यदि मुझे '' जांचने की आवश्यकता है, तो क्या यह नेस्टेड निर्देश रखने का अधिकार है? – Rantiev