2009-05-22 14 views
22

मैं अपने अपाचे httpd.conf में निम्न पंक्ति को शामिल किया है नहीं भेज रहा है स्क्रिप्ट शामिल किए जाने के: -अपाचे 304 प्रतिक्रिया (यदि mod_deflate और AddOutputFilterByType सक्षम है)

<script type="text/javascript" src="/test.js"></script> 

समस्या है, हर बार जब मैं test.html लोड करते हैं, यह भी HTTP स्थिति से भरा हुआ है test.js: 200

सवाल यह है: क्यों सशर्त मिलता है, मैं संतुष्ट नहीं है?

अगर मैं बाहर टिप्पणी httpd.conf में "AddOutputFilterByType" रेखा, अपाचे भेजता 304

अगर मैं httpd.conf में AddOutputFilterByType सक्षम अनुरोध हेडर है: -

 
Host: optimize 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729) FirePHP/0.2.4 
Accept: */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://optimize/ 
Cookie: PHPSESSID=nbq6h0eeahkshkcbc6ctu2j2b4 
If-Modified-Since: Tue, 19 May 2009 07:06:46 GMT 
If-None-Match: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip 
Cache-Control: max-age=0 

और प्रतिक्रिया हेडर है: -

 
Date: Fri, 22 May 2009 07:03:40 GMT 
Server: Apache/2.2.9 (Win32) PHP/5.2.6 
Last-Modified: Tue, 19 May 2009 07:06:46 GMT 
Etag: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip 
Accept-Ranges: bytes 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 52583 
Keep-Alive: timeout=5, max=98 
Connection: Keep-Alive 
Content-Type: application/javascript 

अद्यतन: मैं, देखा है अगर मैं ETag अक्षम करने कर रहा हूँ, यह ठीक से काम करता है। मैं इसे 304.

FileETag None 

भेजता मतलब लेकिन मैं वास्तव में ETag रखने के लिए के रूप में यह है (मैं जानता हूँ कि एक inode प्रकटीकरण मुद्दा है कि वहाँ) चाहते हैं।

+1

क्या तुमने कभी एक वैकल्पिक हल मिला? ऐसा लगता है कि अपाचे 2.4 वही कर रहा है, हमेशा gzip'd सामग्री के लिए 200 प्रतिक्रिया भेज रहा है – virtualeyes

+0

कोई कारण आप ईटीएजी रखना चाहते हैं? उन्हें रखने में कोई वास्तविक बात नहीं है यदि आप केवल स्थिर सामग्री की सेवा कर रहे हैं जिसमें पहले से ही 'अंतिम-संशोधित' तारीख को पुनर्मूल्यांकन के लिए है। निश्चित रूप से, उन्हें कुचलना अब के लिए सबसे आसान आरएफसी-अनुरूप कामकाज होगा। –

+0

ईटैग * आवश्यक हैं।यदि आप कभी भी पुराने संस्करण के साथ सामग्री को प्रतिस्थापित करना चाहते हैं (उदाहरण के लिए जावास्क्रिप्ट फ़ाइल जिसे बिना किसी बग के पुराने संस्करण में वापस करने की आवश्यकता है) और जब फ़ाइल की पुरानी तिथि को वापस लेना है, तो एक साधारण दिनांक तुलना पर्याप्त नहीं होगी । –

उत्तर

0

शायद आप एक (स्क्विड) प्रॉक्सी का उपयोग करते हैं जो HTTP अनुरोधों में हेरफेर करता है?

+0

नहीं, मैं किसी भी प्रॉक्सी का उपयोग नहीं कर रहा हूं। मैं अपने लोकहोस्ट में भी कोशिश कर रहा हूं। वही परिणाम – Sabya

19

यह अपाचे में एक ज्ञात बग है। Apache bug #45023, और summary of Apache 304 etags and mod_deflate देखें।

svn से पुनर्निर्माण इस समस्या को ठीक करेगा। संकल्प उस परिवर्तन को वापस करना था जो "-gzip" को etag में जोड़ता था। हालांकि, HTTP अनुपालन समस्याओं से जुड़े हैं।

RequestHeader edit "If-None-Match" "^\"(.*)-gzip\"$" "\"$1\"" 
Header edit "ETag" "^\"(.*[^g][^z][^i][^p])\"$" "\"$1-gzip\"" 
+3

अपाचे 2.4 पर, "200 ठीक" प्रतिक्रियाओं के अलावा कुछ भी नहीं - क्या यह समाधान वास्तव में काम करता है? – virtualeyes

+3

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

+2

यह अभी भी एक मुद्दा प्रतीत होता है? मैं अपाचे 2.4.10 – Inna

8

"मैं भी तय कर लिया है कि ETags वैसे भी अपाचे में है कि उपयोगी नहीं हैं:

आप अपाचे पुनर्निर्माण नहीं कर सकता है, वहाँ बग रिपोर्ट में एक सुझाव क्रम विन्यास समाधान नहीं है। "

गलत,
उदाहरण के लिए आप संशोधन '2016.07.27 05:00:00' करने के लिए सेट की तारीख के साथ एक फ़ाइल है, तो आप इसे अपने साइट पर अपलोड, ब्राउज़र HTTP कोड 200 के साथ इस फाइल हो जाता है, तो यह कैश और HTTP 304 के साथ हर बार revalidates।
अगला आप एक ही फ़ाइल नाम के साथ एक फ़ाइल अपलोड करते हैं, लेकिन पुराने टाइमस्टैम्प '2013.07.27 05:00:00' और अन्य सामग्री के साथ।

यदि सर्वर पर ईटीएजी अक्षम है, ब्राउज़र केवल If-Modified-Since: का उपयोग यह निर्धारित करने के लिए करेगा कि सर्वर पर फ़ाइल बदल दी गई है, तो अनुरोध If-Modified-Since: 2016.07.27 05:00:00 होगा, लेकिन फ़ाइल इस तिथि के बाद संशोधित नहीं है, इसलिए HTTP 304 वापस आ गया है, यहां तक ​​कि अगर फ़ाइल बदल गई है।

यदि If-Modified-Since: के अलावा, सर्वर पर ईटाग सक्षम है, तो If-None-Match: हेडर ब्राउज़र से आने वाला हेडर होगा जो यह पता लगाएगा कि फ़ाइल बदल दी गई थी (डिफ़ॉल्ट रूप से - टाइमस्टैम्प मेलसमैच + साइज मिस्चैच) और फ़ाइल को फिर से लोड किया जाएगा।


यह समस्या अभी भी अपाचे 2.4.23 में मौजूद है, इसलिए, मैं इस समस्या को हल करने के लिए ऊपर से एक बेहतर कोड लिखा है। लाइन द्वारा एक्सपेशन लाइन:

    1) यदि ब्राउज़र 'if-None-match' अनुरोध भेजता है जिसमें अंत में '-gzip' है, तो variable request_etag = gzip सेट करें।
    2) '-gzip' भाग को बाहर निकालने के लिए अनुरोध शीर्षलेख संपादित करें।
    3) '-gzip' भाग जोड़ने के लिए प्रतिक्रिया शीर्षलेख संपादित करें, लेकिन केवल तभी ब्राउज़र ने '-gzip' अनुरोध भेजा है या प्रतिक्रिया सामग्री gzip एन्कोडेड है।

      "2E2:


    आप या तो नकारात्मक अग्रदर्शी या नकारात्मक lookbehind उपयोग कर सकते हैं, regex गति, एक ही है अपाचे दोनों

    \"(.+(?<!-gzip))\"  #using negative lookbehind 
    \"((?:.(?!-gzip\"))+)\" #using negative lookahead 
    

    टेस्ट मामलों का समर्थन करता है -5388f9f70c580-afeg "
    ,210 "2e2-5388f9f70c580-gzin"
    "2e2-5388f9f70c580-gzipd"
    "2e2-5388f9f70c580gzip"
    "2e2-5388f9f70c580gzip"

कॉपी-चस्पा अपाचे .conf इस कोड

SetEnvIf   If-None-Match "-gzip\"$" request_etag=gzip 
RequestHeader edit If-None-Match "(.+)-gzip\"$" "$1\"" 
Header edit  ETag  "(.+(?<!-gzip))\"$" "$1-gzip\"" "expr=reqenv('request_etag') == 'gzip' || resp('Content-Encoding') == 'gzip'" 


मैं व्यक्तिगत रूप से निम्न कोड का उपयोग करता हूं, जो स्ट्रिप्स '-gzip' भाग शुरू होता है, यदि यह एक gzip प्रतिक्रिया है, और इसे पुन: प्रस्तुत नहीं करता है, तो ब्राउज़र कभी भी '-gzip' 'If-None-Match' शीर्षलेख नहीं भेजेगा।

Header edit ETag "(.+)-gzip\"$" "$1\"" "expr=resp('Content-Encoding') == 'gzip'" 
+0

समस्या अभी भी अपाचे 2.4.25 में मौजूद है। ऊपर दिए गए 3 लाइन कोड ने मेरी मदद की लेकिन मुझे 'headers_module' को सक्षम करने की आवश्यकता थी। – ilhan

0

मैं जानता हूँ कि यह एक बहुत पुरानी सवाल है, लेकिन यह वहाँ एक और अधिक अप-टू-डेट जवाब प्रकट होता है।

अपाचे को -gzip प्रत्यय संलग्न करने के लिए, आपको के मान के साथ DeflateAlterETag निर्देश का उपयोग करना होगा।

यह यहाँ के लिए दस्तावेज़ देखें: http://httpd.apache.org/docs/trunk/mod/mod_deflate.html#deflatealteretag

संबंधित मुद्दे