2010-08-06 7 views
5

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

मैं .htaccess का उपयोग कर कैशिंग को नियंत्रित कर रहा हूं (या नियंत्रित करने का प्रयास कर रहा हूं)। यदि उपयोगकर्ता वापस हिट करता है (ब्राउज़र बटन, माउस बटन, alt + left, backspace) इसे कैश से पृष्ठ को फिर से लोड करने की आवश्यकता होती है। आईईएस 6-8 और क्रोम इसके साथ ठीक थे। फ़ायरफ़ॉक्स थोड़ी देर के लिए काम नहीं कर रहा था और हाल ही में काम करना शुरू कर दिया था, लेकिन समस्या सफारी में बनी हुई है। यह थोड़ा अजीब लगता है, क्योंकि मुझे उम्मीद है कि सफारी और क्रोम उसी तरह से व्यवहार करेंगे।

यह मेरा .htaccess फाइल है:

# Add Proper MIME-Type for Favicon 
AddType image/x-icon .ico 

<IfModule mod_expires.c> 
    ExpiresActive On 
# ExpiresDefault A2630000 
    ExpiresByType image/x-icon A2630000 
    ExpiresByType image/gif A2630000 
    ExpiresByType image/jpeg A2630000 
    ExpiresByType image/png A2630000 
    ExpiresByType application/x-javascript M2630000 
    ExpiresByType application/javascript M2630000 
    ExpiresByType text/css M2630000 
</IfModule> 

<IfModule mod_headers.c> 
    Header set Cache-Control "public" 
    <FilesMatch "\.php$"> 
     Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0" 
    </FilesMatch> 
</IfModule> 

SetOutputFilter DEFLATE 

AddOutputFilterByType DEFLATE text/css 
AddOutputFilterByType DEFLATE application/javascript 

मैं के साथ और कैश-नियंत्रण सार्वजनिक लाइन के बिना यह कोशिश की है।

AddType application/x-httpd-php .php 

साथ:

ExpiresByType application/x-httpd-php A0 

कोई लाभ उठाने के लिए

मैं भी जोड़ने की कोशिश की है।

क्या मुझे कुछ याद आ रही है?

संपादित करें: मुझे नहीं लगता कि यह कैश सेटिंग्स के साथ कुछ भी करना है।

मैं PHP खुद को यह जोड़ने की कोशिश की है:

#safari test 
if (strstr($_SERVER['HTTP_USER_AGENT'],'Safari')){ 
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
} 

और यहां तक ​​कि उन पंक्तियों मैं में देखते हैं "का निरीक्षण तत्व" कर सकते हैं> संसाधन है कि सही शीर्षलेख प्राप्त किया जा रहा है बिना। ऐसा लगता है कि सफारी उनके साथ "सबसे तेज़ ब्राउज़र" बनने के लिए क्या कर रही है। ऐसा लगता है कि यह साइट डेवलपर्स की विशिष्टता को स्पष्ट रूप से अनदेखा करता है - यह उस दिन से आईई की मूल मानसिकता की तरह लगता है जब लेआउट के लिए उपयोग की जाने वाली टेबल।

+1

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

उत्तर

3

HTTP spec स्पष्ट रूप से कहता है कि इतिहास (बैक/फॉरवर्ड बटन) से याद करने से कैश सत्यापन नहीं करना पड़ता है। तो यह वैध व्यवहार लगता है।

<meta http-equiv="cache-control" content="no-cache, no store, must-revalidate"/> 
+0

हाँ, पैसे पर धमाके। यह कैशिंग के मामले में नहीं है (बाद के अनुरोधों के लिए पुन: उपयोग करने के लिए प्रतिक्रियाओं को संग्रहीत करना जिसके लिए वे वैध हैं) लेकिन इतिहास का। इतिहास बदलने की कोशिश करने के लिए यह बहुत कम समझ में आता है। –

0

मैं फ़ायरफ़ॉक्स के साथ एक समान समस्या लेकिन कोड के साथ .htaccess संशोधित ...

<IfModule mod_headers.c> 
    Header set Cache-Control "public" 
    <FilesMatch "\.php$"> 
     Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0" 
    </FilesMatch> 
</IfModule> 

था ... कि, विडंबना यह है कि, आप अपने कोड में है, मेरे लिए यह तय हो गई। हालांकि सफारी समस्या के बारे में निश्चित नहीं है।

0

अपने HTML में एक meta टैग के रूप में जोड़ने का प्रयास करें? यदि ऐसा है, तो मुझे संदेह है कि आप अपाचे 2.0 का उपयोग कर रहे हैं और अपाचे 2.2 में अपग्रेड करने से इस समस्या को हल किया जाता है।

0

सफारी आप 304 दे रही है, जबकि क्रोम नहीं करता है:

+0

सफारी 200 की स्थिति दे रहा है, जैसा क्रोम करता है। – bcmcfc

1

यह व्यवहार back-forward Cache के कारण होता है। जब उपयोगकर्ता बैक बटन के साथ नेविगेट करता है तो आप onpageshow ईवेंट में टैप कर सकते हैं। persisted नामक संपत्ति की तलाश करें। यह प्रारंभिक पेजेलोड पर गलत पर सेट है। हालांकि जब पृष्ठ bfcache से आता है तो यह सत्य पर सेट होता है।

फिर आप जावास्क्रिप्ट के साथ पुनः लोड पेज मजबूर कर सकते हैं:

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload(true) 
    } 
}; 

या यदि आप jQuery का उपयोग कर रहे हैं:

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload(true) 
    } 
}; 
+0

धन्यवाद! मेरे लिए काम किया! – kstratis

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

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