2009-10-18 14 views
13

मैं फ़ाइलों की सेवा के लिए एक PHP स्क्रिप्ट का उपयोग कर रहा हूं। मैं अपने http प्रतिक्रिया में संशोधित शीर्षलेख को 304 वापस भेजने में सक्षम होना चाहूंगा यदि क्लाइंट ने आखिरी बार इसे डाउनलोड करने के बाद फ़ाइल नहीं बदली है। यह अपाचे (और अधिकांश अन्य वेब सर्वर) में एक विशेषता प्रतीत होता है, लेकिन मुझे कोई संकेत नहीं है कि इसे PHP के माध्यम से कैसे कार्यान्वित किया जा सकता है।304: संशोधित नहीं है और फ्रंट एंड कैशिंग

मैंने $_SERVER['HTTP_IF_MODIFIED_SINCE'] का उपयोग करने के बारे में सुना है, लेकिन यह चर मेरे $_SERVER सुपर सरणी में दिखाई नहीं दे रहा है।

मेरा प्रश्न यह नहीं है कि 304 शीर्षलेख वापस कैसे करें, लेकिन यह कैसे पता चले कि उसे वापस किया जाना चाहिए।


संपादित करें: समस्या यह है कि मेरी $_SERVER['HTTP_IF_MODIFIED_SINCE'] सेट नहीं है है।

ExpiresActive On 
ExpiresByType image/jpeg "modification plus 1 month" 
ExpiresByType image/png "modification plus 1 month" 
ExpiresByType image/gif "modification plus 1 month" 
Header append Cache-Control: "must-revalidate" 


<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond $1 !^(controller\.php) 
    RewriteRule (.*\.jpg|.*\.png|.*\.gif) controller.php/$1 
</IfModule> 

HTTP_IF_MODIFIED_SINCE अभी भी $_SERVER सुपर सरणी में प्रकट नहीं होता है: यह मेरा .htaccess फ़ाइल की सामग्री है।

उत्तर

26

HTTP_IF_MODIFIED_SINCE ऐसा करने का सही तरीका है। यदि आप इसे प्राप्त नहीं कर रहे हैं, तो जांच करें कि अपाचे में mod_expires और mod_headers सक्षम है और ठीक से काम कर रहा है। a comment on PHP.net से उधार लिया: जब register_globals बंद है

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 
// always send headers 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 
// exit if not modified 
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 

// output data 
+1

मैंने ऐसा करने का यह तरीका देखा है, लेकिन $ _SERVER ['HTTP_IF_MODIFIED_SINCE'] हमेशा मेरे लिए खाली है ... –

+0

मेरे हालिया संपादन की जांच करें - मैंने महत्वपूर्ण अपाचे कॉन्फ़िगर जानकारी का एक टुकड़ा छोड़ा है। –

+0

http://www.webmasterworld.com/forum23/2300.htm के अनुसार मेरी htaccess.txt फ़ाइल को संशोधित करने का प्रयास किया, लेकिन कोई नहीं। कोई विचार? –

0

$_SERVER['HTTP_IF_MODIFIED_SINCE'] आमतौर पर खाली है।

चेक ऐसी बात है, और यदि ऐसा है तो कोशिश getenv('HTTP_IF_MODIFIED_SINCE')

1

This article कैशिंग पर अपने सभी सवालों का जवाब देंगे कि क्या

मैंने पाया कि मेरी htaccess फ़ाइल के नीचे करने के लिए

RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}] 
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}] 

जोड़ने (सभी rewriterule के नीचे) काम किया। एक

$_SERVER['HTTP_IF_NONE_MATCH'] && $_SERVER['HTTP_IF_MODIFIED_SINCE'] 

जो, अपने सिस्टम घड़ी के रूप में एक उचित 304 हैडर वापस जाने के लिए आवश्यक हैं था:

0

भी कुछ अन्य लोगों की जांच करने के मापदंडों हैं .. मेरे मामले में मैं उन हेडर के दोनों नहीं किया था थोड़ा देर से, यह भविष्य में समाप्त हो रही है, तो सब

पर उन मूल्यों को नहीं भेज इसके अलावा कि शीर्ष लेख जो अपाचे द्वारा दिया जाता है की जाँच के रूप में उन पृष्ठों की व्याख्या करेंगे, या कम से कम यह एक बड़ा मूल्य

Cache-Control: max-age=3600 
को ओवरराइड

के रूप में यह पिछले हेडर इस सुंदर काम समारोह function lastModified($file){ $x=filemtime($file); while($x>time())$x-=86000;}#reduce by one day if touched in future date $date=gmdate('D, j M Y H:i:s',$x).' GMT'; header('Cache-Control: max-age=86000',1); if($_SERVER['HTTP_IF_NONE_MATCH'] == $x || $_SERVER['HTTP_IF_MODIFIED_SINCE']==$date){ header('HTTP/1.1 304 Not Modified',1,304);die;} header('Etag: '.$x,1);header('Last-Modified: '.$date,1); }

0

मैं इस समस्या थी और यह निकला बस है कि मैं था नहीं भेजेंगे अगर

Last-Modified previous sent header < (NOW - 3600) 

तो मेरे मामले में मैं निर्धारित किया है फायरबग खुला इसमें नेट टैब "ब्राउज़र कैश अक्षम करें" के तहत एक विकल्प है जिसे डिफ़ॉल्ट रूप से चुना जाता है। क्रोम के डेवलपर टूल में एक समान विकल्प है, मेनू बार के नीचे बार पर टिक बॉक्स में से एक।

इन विकल्पों को अनदेखा करने के परिणामस्वरूप ब्राउज़र HTTP_IF_MODIFIED_SINCE और सभी के बाद ठीक से काम कर रहा है (यहां तक ​​कि फायरबग या क्रोम देव टूल्स के साथ भी)।

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