2009-12-21 24 views
9

कुछ है, मुझे लगता है कि अपाचे, सभी प्रतिक्रियाओं PHP स्क्रिप्ट द्वारा उत्पन्न करने के लिए इन HTTP हेडर जोड़ता है:पीएचपी निकालें HTTP हेडर

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

यह वास्तविक गतिशील पृष्ठों के लिए ठीक काम करता है, लेकिन मैं कुछ पेज कि, जबकि द्वारा उत्पन्न की है PHP, ज्यादातर स्थिर हैं, और मैं ब्राउज़र को उन्हें कैश करना चाहता हूं।

क्या प्रतिक्रिया में उन शीर्षकों को हटाने के लिए PHP में कोई तरीका है, और इस प्रकार ब्राउज़र के डिफ़ॉल्ट कैशिंग नियमों को सक्रिय करें, या यदि नहीं, तो क्या कोई मूल्य है जो मैं उन्हें अनुपस्थित होने के बराबर सेट कर सकता हूं?

मैं अपने खुद के मूल्य निर्धारित नहीं करना चाहूंगा, क्योंकि मैं चाहता हूं कि ब्राउजर उसी कैशिंग नियमों का उपयोग करें जो स्थिर संसाधनों के लिए हैं जो अपाचे द्वारा ही प्रदान किए जाते हैं (mod_cache का उपयोग किए बिना)।

उत्तर

2

सबसे पहले मैं यह जांचता हूं कि यह वास्तव में इन शीर्षकों को सेट करने वाली PHP स्क्रिप्ट्स में से एक नहीं है या नहीं।

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

क्या यह आपके सर्वर पर कुछ "उपयोग करने योग्य" प्रिंट करता है?

+1

मैंने शोध किया है, और ऐसा लगता है कि सत्र फ़ंक्शंस का उपयोग करते समय PHP हेडर सेट करता है। मैंने देखा प्रासंगिक दस्तावेज़ों के आस-पास। शीर्षकों के मान को बदलने के तरीके हैं, लेकिन उन्हें सेट होने से नहीं रोकते हैं। –

+2

असल में, session.cache_limit को "none" (undocumented value) में सेट करने से इसे हल किया गया। http://stackoverflow.com देखें/प्रश्न/681115/कैश-कंट्रोल-हेडर-संशोधित-द्वारा-php-session –

+0

वाह, मैंने उस उम्र के लिए सोचा नहीं होगा ;-) – VolkerK

2

आप मैन्युअल रूप से header() फ़ंक्शन के माध्यम से PHP से HTTP शीर्षलेख प्रदान कर सकते हैं।

मुझे लगता है कि ऐसा करने से वेब सर्वर के डिफ़ॉल्ट शीर्षलेख मान अक्षम करना चाहिए।

+0

यदि मैं उन्हें एक खाली स्ट्रिंग पर सेट करता हूं, उदा। "कैश-कंट्रोल:", ब्राउजर इस तरह की व्याख्या करेंगे जैसे अनुपस्थित है? –

+0

क्या आप वाकई हैं कि PHP केवल हेडर लाइन नहीं जोड़ रहा है, लेकिन पूरी तरह से नया हेडर उत्पन्न करेगा? – dusoft

+0

डिफ़ॉल्ट व्यवहार मौजूदा हेडर को उसी नाम से प्रतिस्थापित करना है, जैसा कि शीर्षलेख के लिए दस्तावेज़ों में देखा गया है() –

7

उन विशेष फ़ाइलों के लिए आप हेडर() कॉल जोड़ सकते हैं जो उन शीर्षकों को अलग-अलग सेट करते हैं। अर्थात। header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

यदि संभव हो, तो मैं वास्तव में हेडर को पूरी तरह से हटा देना चाहता हूं, ताकि ब्राउज़र व्यवहार सामान्य स्थिर फ़ाइलों के समान ही हो एक कॉन्फ़िगर किए गए सर्वर पर। –

+0

चूंकि यह PHP वातावरण के बाहर होता है, अपाचे में चारों ओर खुदाई करने से कम, दूसरे मूल्य के साथ ओवरराइटिंग आपकी सबसे अच्छी शर्त होगी। मैं आमतौर पर सामग्री कैश रखने के लिए स्थिर सामग्री (10 साल पढ़ें) के लिए हास्यास्पद समाप्ति तिथियों का उपयोग करूंगा। – Myles

+1

मुझे चिंतित है कि यदि मैं इसे भविष्य में 10 साल की तारीख में सेट करता हूं, तो वास्तव में परिवर्तन उपयोगकर्ताओं द्वारा नहीं उठाए जाएंगे। –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

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

http://php.net/manual/en/function.header.php

0

दबाने कैश के रूप में बनाया जा सकता है इस प्रकार है: पीएचपी कोड:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 

यदि आप स्वचालित रूप से इसे उत्पन्न करना चाहते हैं, तो आप इस यहाँ: पीएचपी: session_cache_limiter() - वे मैनुअल

+0

यह वही है जो मैं –

+0

को क्षमा करने की कोशिश कर रहा हूं, लेकिन आपको ब्राउज़र कैश रोल तक पहुंच नहीं है, इसलिए आपको http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

मैंने यह कोशिश नहीं की है लेकिन आप शायद अपने कस्टम हेडर के साथ .html फ़ाइलों के रूप में ऐसे पृष्ठों को सहेज सकते हैं या उनकी कमी और 0 स्क्रिप्ट

01 के अंदर चल सकती है
0

आपके कोड में कहीं भी ऐसा संभव है जिसने इन चर सेट किए हैं, क्योंकि मुझे नहीं पता कि वे कहीं भी PHP द्वारा स्वचालित रूप से कहां डाले जाते हैं, और न ही वे मेरे किसी भी LAMP इंस्टॉलेशन में हैं।

PHP इंस्टॉल के साथ मेरे इंस्टॉल के लिए केवल स्वचालित रूप से जेनरेट किया गया हेडर X-Powered-By है।

आप जो बोलते हैं उसे के रूप में, डॉक्स से वे header("Expires:"); कह करने की सलाह देते वर्ष हैडर को बदलने के लिए है, लेकिन header("Cache-control:"); बस अपना ब्राउज़र में Cache-Control: max-age=0 बन गया (तो यह नहीं है तुम क्या करने की कोशिश कर रहे हैं)।

मैं यह जांचने की सिफारिश करता हूं कि ये मान एक ढांचे या सेटिंग से बदलते हैं या नहीं, लेकिन यह PHP/प्लेटफॉर्म के विभिन्न संस्करणों में अलग हो सकता है जो आप PHP पर चल रहे होंगे।

मैं वैश्विक विन्यास, vhosts, pr में ExpiresByType या ExpiresDefault निर्देशों की जांच करता हूं।htaccess फाइल या <IfModule mod_expires> या <IfModule mod_expires.c>

में समझाया किसी भी ब्लॉक "मैं ब्राउज़र निश्चित संसाधनों कि अपाचे से ही (mod_cache का उपयोग किए बिना) सेवा कर रहे हैं के लिए के रूप में ही कैशिंग नियमों का उपयोग करना चाहते हैं।"

एक स्थिर संसाधन को देखने का प्रयास करें और उसके बाद नियमों का मिलान करें। आप इस के साथ समाप्त होने की समाप्ति की गणना कर सकते हैं ->http://www.php.net/manual/en/function.header.php#93377

+0

मुझे यकीन है कि हेडर PHP के भीतर से सेट नहीं हैं। @ "एक स्थैतिक संसाधन को देखने का प्रयास करें और फिर नियमों से मेल खाते हैं।": यही बात है, उनके पास इन शीर्षलेख नहीं हैं;) –

+0

मुझे आपके लिए यह आसान बनाने दें, "क्या कोई मूल्य है जिसे मैं उन्हें सेट कर सकता हूं यह अनुपस्थित होने के बराबर है?" नहीं वास्तव में। (खाली) प्रत्येक ब्राउज़र द्वारा interpretted कर दिया जाएगा। " मैं अपने खुद मूल्यों " इस के रूप में आप या आपके मेजबान पहले से ही कहीं असंभव है। –

+0

ठीक है स्थापित करने के लिए नहीं पसंद करते हैं, मैं निश्चित था हेडर मेरे कोड द्वारा सेट नहीं किए गए थे। जाहिर है, जब आप इसका सत्र उपयोग करते हैं तो वे PHP द्वारा सेट होते हैं। मेरी टिप्पणी देखें @ वोल्करके –

0

अपने पृष्ठों नहीं अक्सर आप ETag हेडर का उपयोग, इस तरह विचार करना चाहिए करने के लिए बदल रहे हैं:

https://gist.github.com/oliworx/4951478

यह विशेष रूप से धीमे कनेक्शन पर (मोबाइल फोन) की तरह उपयोगी है।

सुझाव: आपको हमेशा यह सुनिश्चित करना चाहिए, क्या ब्राउज़र वास्तव में फ़ायरफ़ॉक्स ऐड-ऑन के साथ, लोड कर रहा है "लाइव HTTP हेडर": https://addons.mozilla.org/de/firefox/addon/live-http-headers/

1

ये कैश हेडर भेजा जाता है जब आप सत्र का उपयोग शुरू और स्थापित करने के लिए "nocache" द्वारा चूक; यह सुनिश्चित करता है कि प्रत्येक अनुरोध लगातार परिणाम देता है।

उदाहरण के लिए, यदि आपके पास एक कार्ट सिस्टम है और आपका ब्राउज़र /add?product=xyz कैश करता है, तो यह उत्पाद को फिर से नहीं जोड़ सकता है; यह शायद आप नहीं चाहते हैं।

करने के बाद कहा कि, डिफ़ॉल्ट सेटिंग से पहलेsession_start() या इसी session.cache_limiter कॉन्फ़िगरेशन सेटिंग की स्थापना session_cache_limiter()का उपयोग कर या तो द्वारा बदला जा सकता।

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