2010-01-18 15 views
8

मेरा प्रश्न है कि मुझे दोनों प्राप्त होने पर HTTP 304 "संशोधित नहीं किया गया" जवाब देने के बारे में है, तो कोई भी मैच और अगर-संशोधित- चूंकि प्रॉक्सी/क्लाइंट अनुरोध से।एचटीएमएल अगर-कोई-मैच और यदि संशोधित-से -4 और PHP में 04 स्पष्टीकरण PHP

आरएफसी से 2616 secttion 14.26 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):

इकाई टैग मैच में से कोई भी, तो सर्वर का अनुरोध किया विधि प्रदर्शन कर सकते हैं, तो मानो तो कोई मिलान नहीं वाले हैडर क्षेत्र नहीं था मौजूद है, लेकिन अनुरोध में किसी भी अगर-संशोधित-हेडर फ़ील्ड को अनदेखा करना चाहिए। यही है, अगर कोई इकाई टैग मेल नहीं खाता है, तो सर्वर 304 (संशोधित नहीं) प्रतिक्रिया वापस नहीं करना चाहिए।

मैं इस कथन को समझने के लिए यकीन नहीं है ...

  1. PHP में "इकाई टैग मैच में से कोई भी अगर" वे $_SERVER['HTTP_IF_NONE_MATCH'] मेरी ETags कि मैंने पहले भेजा बनाम की बात करते हैं?
  2. अगर मैं सही ढंग से इस कथन को समझता हूं, जैसे ही $_SERVER['HTTP_IF_NONE_MATCH'] में सूचीबद्ध ईटैग में से कोई भी मेरे ईटैग से मेल नहीं खाता है, तो मैं सभी सत्यापन रोकता हूं और सामान्य रूप से पृष्ठ की सेवा करता हूं।

कोई भी इस आरएफसी भाग को छद्म कोड (या PHP कोड) में अनुवाद कर सकता है और/या उपरोक्त मेरे 2 अंक का उत्तर दे सकता है?

संपादित करें 1: आपके उत्तर के लिए सेंटवॉलैंड धन्यवाद। आप (या किसी और) मुझे बता सकते हैं अगर मैं इन 6 अंक पर सही कर रहा हूँ:

  1. $_SERVER['HTTP_IF_NONE_MATCH'] का स्वरूप हो सकता है या तो:

    एक) यदि कोई मिलान नहीं: "xyzzy", "r2d2xxxx", "c3piozzzz"

    ख) यदि कोई मिलान नहीं: "xyzzy"

    और नहीं:

    ग) यदि कोई मिलान नहीं: "xyzzy, r2 d2xxxx, c3piozzzz "

  2. यदि !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER), anyTagMatched() शून्य देता है।

  3. जैसे ही $_SERVER['HTTP_IF_NONE_MATCH'] में एक ईटाग मेरे दस्तावेज़ ईटाग से मेल खाता है, anyTagMatched() सत्य लौटाता है।

  4. यदि $_SERVER['HTTP_IF_NONE_MATCH'] में एटैग में से कोई भी मेरे दस्तावेज़ ईटाग से मेल नहीं कर रहा है, anyTagMatched() गलत लौटाता है।

  5. यदि $_SERVER['HTTP_IF_MODIFIED_SINCE'] सेट किया गया है और मेरे दस्तावेज़ "आखिरी संशोधित" दिनांक isExpired() से मेल खाता है, तो अन्यथा सत्य लौटाएं।

  6. जैसे ही anyTagMatched() के रूप में रिटर्न सही, मैं एक 304 तो anyTagMatched() शून्य लौट आए और isExpired() गलत मैं एक 304 जारी कर सकते हैं लौटे जारी करते हैं।किसी अन्य स्थिति में मैं अपने पृष्ठ को सामान्य के रूप में सेवा देता हूं (मैं अद्यतित अंतिम-संशोधित और ईटीएजी शीर्षलेख भी जारी करता हूं)।

+0

पर एक नज़र डालें: - http://stackoverflow.com/questions/2000715/answering-httpifmodifiedsince-and-httpifnonematch-in-php - http://stackoverflow.com/questions/1583740/304- संशोधित-और-फ्रंट-एंड-कैशिंग –

+1

परिभाषा के अनुसार, एक निर्विवाद मूल्य अमान्य है (देखें http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11)। – Gumbo

+0

जानना बहुत अच्छा है, मुझे आरएफसी में उन फील्ड परिभाषाओं को पढ़ना सीखना चाहिए! प्वाइंट "1-सी" अभी भी सही है? – AlexV

उत्तर

5

इसे अंत में रखा जाना चाहिए (बेहतर दिखने के लिए स्थानांतरित)।

$anyTagMatched = anyTagMatched() ; 
if($anyTagMatched || ((null === $anyTagMatched) && !isExpired())) { 
    notModified() ; 
} 
// Output content 

स्यूडोकोड (समीक्षा की आवश्यकता है):

<?php 

/** 
* Calculates eTag for the current resource. 
*/ 
function calculateTag() { 
} 

/** 
* Gets date of the most recent change. 
*/ 
function lastChanged() { 
} 

/** 
* TRUE if any tag matched 
* FALSE if none matched 
* NULL if header is not specified 
*/ 
function anyTagMatched() { 
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false ; 

    if(false !== $if_none_match) { 
     $tags = split(", ", $if_none_match) ; 
     $myTag = calculateTag() ; 
     foreach($tags as $tag) { 
      if($tag == $myTag) return true ; 
     } 
     return false ; 
    } 
    return null ; 
} 

function isExpired() { 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    if(false !== $if_modified_since) { 
     // Compare time here; pseudocode. 
     return ($if_modified_since < lastChanged()) ; 
    } 

    return true ; 
} 

function notModified() { 
    header('HTTP/1.0 304 Not Modified'); 
    exit ; 
} 

मुख्य जवाब here

+0

आपके isExpired() फ़ंक्शन में क्या होगा अगर $ if_modified_since == झूठी? फ़ंक्शन कुछ भी वापस नहीं करता है ... – AlexV

+0

यह स्पष्ट रूप से 'सत्य' वापस आना चाहिए, क्योंकि IF-Modified-SINCE शीर्षलेख सेट नहीं है। मैंने तदनुसार कोड बदल दिया है। इसके लिए खेद है, इसे वास्तव में गहरी परीक्षा की आवश्यकता है, लेकिन यही वह है जिसे आप पूछ रहे थे: स्यूडोकोड। –

+0

प्रश्न में "संपादित करें 1" जोड़ा गया। यदि आपके पास मेरे अंक की पुष्टि करने का समय है तो यह बहुत अच्छा होगा। बहुत धन्यवाद! – AlexV