2011-01-21 3 views
18

मैं अपने Nginx में एक संसाधन है कि इस तरह कॉन्फ़िगर किया गया है मिल गया है:कैश-कंट्रोल हेडर दोहराए गए; मान्य या नहीं? (Nginx)

location ~ foo\.js$ { 
    add_header Cache-Control public; 
    expires 1d; 
} 

अगर मैं Firebug के साथ इस खोलने के लिए और हेडर को देखो यह इस से पता चलता:

Cache-Control max-age=86400, public 

साइट HTTPS का उपयोग कर रही है, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मुझे यह सही लगे क्योंकि स्पष्ट रूप से ब्राउज़र इसे तब तक कैश नहीं करते जब तक कि यह अधिकतम आयु> 0 और public न हो। See this

लेकिन क्या मेरी Nginx साथ होता है जब मैं का उपयोग curl -Ik https://... है कि यह कहते हैं:

... 
Expires: Sat, 22 Jan 2011 18:23:36 GMT 
Cache-Control: max-age=86400 
Cache-Control: public 
... 

यह Cache-Control हैडर को दोहराता है! स्पष्ट रूप से फायरबग दिमाग में नहीं है। लेकिन क्या यह सही है?

क्या Expires और Cache-Control (public के साथ) को केवल दो पंक्तियों में सेट करने का शायद एक बेहतर तरीका है?

+0

क्या आप निश्चित रूप से अधिकतम आयु और जनता की आवश्यकता के बारे में सुनिश्चित हैं? Spec के अनुसार (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html), खंड 14.9.3 कहता है कि "प्रतिक्रिया पर अधिकतम आयु निर्देश का तात्पर्य है कि प्रतिक्रिया कैशबल है (यानी।, "सार्वजनिक") जब तक कि कुछ अन्य, अधिक प्रतिबंधक कैश निर्देश भी मौजूद न हों। " – herbrandson

उत्तर

24

हां, यह एकाधिक कैश-कंट्रोल हेडर का उपयोग करने के लिए मान्य और समकक्ष है।

से अधिक संदेश-हेडर फील्ड के साथ एक ही क्षेत्र के नाम संदेश में मौजूद हो सकता यदि और केवल यदि है कि शीर्ष लेख क्षेत्र के लिए पूरे क्षेत्र के मूल्य है परिभाषित:

HTTP 1.1 spec से

अल्पविराम से अलग सूची [यानी, # (मान)] के रूप में। यह कई शीर्ष लेख फ़ील्ड में संयोजन संभव किया जाना चाहिए:,, "क्षेत्र के नाम क्षेत्र के मूल्य" जोड़ी अर्थ विज्ञान बदलते संदेश के बिना पहली करने के लिए प्रत्येक बाद क्षेत्र के मूल्य जोड़कर, प्रत्येक अलग एक अल्पविराम से।

कैश-नियंत्रण = "कैश-नियंत्रण" ":" 1 # कैश-निर्देश

यह सत्यापित करने के लिए कि इस प्रावधान how it's defined की वजह से कैश नियंत्रण हेडर पर लागू होता है आसान है

ऊपर की रेखा की व्याख्या करने के तरीके को समझने के लिए, spec's notational conventions देखें। 1# का अर्थ है "एक या अधिक की अल्पविराम से अलग सूची"।

+1

तो, यह HTTP spec के आधार पर मान्य है, लेकिन असली सवाल यह है कि लोकप्रिय ब्राउज़र और प्रॉक्सी एकाधिक कैश-कंट्रोल हेडर से कैसे निपटते हैं? नवीनतम और सबसे बढ़िया शायद इसे सही तरीके से संभाल लें, लेकिन विशेष रूप से फ़ायरफ़ॉक्स कैश नहीं लगता है जब भी आपके कैश-कंट्रोल हेडर सेटअप के बारे में "असामान्य" कुछ भी होता है। किसी के पास इसका एक अच्छा परीक्षण करने का लिंक है? मुझे ऐसा करने से नफरत है खुद को अगर यह पहले से ही किया जा चुका है ;-) – rmalayter

+0

spec पढ़ने के दौरान मुझे याद किया गया उल्लेखनीय सम्मेलन यह था कि 1 # कैश-निर्देश का अर्थ एक या अधिक कैश निर्देशों की अल्पविराम से अलग सूची है। इसलिए संकीर्ण करने के लिए, "#rule" में देखें [उल्लेखनीय सम्मेलन] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html) –

5

मुझे विभिन्न कॉन्फ़िगरेशन पर एक ही समस्या थी। मेरे लिए क्या काम किया गया है, "सर्वर" उद्घाटन ब्रैकेट के ठीक बाद हेडर सेट करने के लिए दो लाइनों के क्रम को बदलना है। यह शायद सभी वस्तुओं के लिए हेडर सेट हो जाएगा, लेकिन हो सकता है आप में "अगर" बयान भी काम करेगा:


server { 
    expires  31d; 
    add_header Cache-Control public; 

    server_name example.com 
    ... 
} 

 

ऐसा लगता है कि add_header हेडर भेजता से पहले निर्देश समाप्त हो रहा है इसे बदलने के लिए समय है।

+0

वास्तव में सवाल का जवाब नहीं पूछा गया लेकिन अत्यधिक प्रासंगिक, आईएमओ –

+0

इसके अलावा यह नहीं है ork अब '' ' कैश-नियंत्रण: अधिकतम उम्र = 3600 \ N कैश-नियंत्रण: निजी, must-पुनः सत्यापित, प्रॉक्सी-पुनः सत्यापित, अधिकतम उम्र = 3600''' config का कहना है: ' '' 1h की समय सीमा समाप्त हो जाती है; \ n add_header कैश-कंट्रोल "निजी, जरूरी-पुनरीक्षित, प्रॉक्सी-पुनरीक्षण, अधिकतम आयु = 3600"; '' '(स्वरूपण के बारे में खेद है) –