سؤال

سؤالي حول كيفية الرد على HTTP 304 "لم يتم تعديله" عندما أتلقى على حد سواء إذا لم يسبق له مثيل وما إذا كان المعدل من طلب وكيل/عميل.

من RFC 2616 Secttion 14.26 ( http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.26 ):

إذا لم تتطابق أي من علامات الكيان ، فيجب على الخادم تنفيذ الطريقة المطلوبة كما لو أن حقل رأس IF-Match غير موجود ، ولكن يجب أن يتجاهل أيضًا أي حقل (حقل) (ق) في الطلب. أي أنه إذا لم تتطابق علامات كيان ، فيجب ألا يعيد الخادم استجابة 304 (غير معدلة).

لست متأكدًا من فهم هذا البيان ...

  1. "إذا لم تتطابق أي من علامات الكيان" في PHP ، فهل يتحدثون عنه $_SERVER['HTTP_IF_NONE_MATCH'] مقابل etags التي أرسلتها سابقًا؟
  2. إذا فهمت هذا البيان بشكل صحيح ، فبأسرى أي من etags المدرجة في $_SERVER['HTTP_IF_NONE_MATCH'] تطابق etags الخاصة بي ، وأوقف جميع التحقيقات وأخدم الصفحة بشكل طبيعي.

يمكن لأي شخص ترجمة جزء RFC هذا في الرمز الزائف (أو رمز PHP) و/أو الإجابة على نقطتي أعلاه؟

تحرير 1:شكرا لك سانت وولاند على إجابتك. هل يمكنك (أو أي شخص آخر) أن تخبرني إذا كنت على صواب في هذه النقاط الست:

  1. شكل $_SERVER['HTTP_IF_NONE_MATCH'] يمكن للإثنين:

    أ) إذا لم يكن هناك ما بعد المباراة: "Xyzzy" ، "R2D2XXXX" ، "C3Piozzzz"

    ب) إذا لم يكن هناك ما بعد المباراة: "xyzzy"

    و لا:

    ج) إذا لم يكن هناك ما بعد المباراة: "xyzzy ، r2d2xxxx ، c3piozzzz"

  2. لو !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER), ، anytagmatched () إرجاع فارغة.

  3. بمجرد etag في $_SERVER['HTTP_IF_NONE_MATCH'] تطابق المستند الخاص بي etag ، anytagmatched () إرجاع true.

  4. إذا لم يكن أي من etags في $_SERVER['HTTP_IF_NONE_MATCH'] يطابقون مستندتي etag ، anyTagMatched() يعود خطأ.

  5. لو $_SERVER['HTTP_IF_MODIFIED_SINCE'] تم تعيينه ويطابق تاريخ مستند "آخر تعديل" isExpired() إرجاع خطأ ، وإلا عد صحيح.

  6. في أقرب وقت anyTagMatched() إرجاع صحيح ، أقوم بإصدار 304. إذا عاد أي شيء isExpired() تم إرجاعها ، يمكنني إصدار 304. في أي موقف آخر ، أخدم صفحتي كالمعتاد (أقوم أيضًا بإصدار رؤوس ETAG المعدلة الأخيرة والمعدلة).

هل كانت مفيدة؟

المحلول

يجب وضع هذا في النهاية (تم نقله لإلقاء نظرة أفضل).

$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 ;
}

الجواب الرئيسي هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top