http if-match و if-modified-since و 304 توضيح في PHP
سؤال
سؤالي حول كيفية الرد على HTTP 304 "لم يتم تعديله" عندما أتلقى على حد سواء إذا لم يسبق له مثيل وما إذا كان المعدل من طلب وكيل/عميل.
من RFC 2616 Secttion 14.26 ( http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.26 ):
إذا لم تتطابق أي من علامات الكيان ، فيجب على الخادم تنفيذ الطريقة المطلوبة كما لو أن حقل رأس IF-Match غير موجود ، ولكن يجب أن يتجاهل أيضًا أي حقل (حقل) (ق) في الطلب. أي أنه إذا لم تتطابق علامات كيان ، فيجب ألا يعيد الخادم استجابة 304 (غير معدلة).
لست متأكدًا من فهم هذا البيان ...
- "إذا لم تتطابق أي من علامات الكيان" في PHP ، فهل يتحدثون عنه
$_SERVER['HTTP_IF_NONE_MATCH']
مقابل etags التي أرسلتها سابقًا؟ - إذا فهمت هذا البيان بشكل صحيح ، فبأسرى أي من etags المدرجة في
$_SERVER['HTTP_IF_NONE_MATCH']
تطابق etags الخاصة بي ، وأوقف جميع التحقيقات وأخدم الصفحة بشكل طبيعي.
يمكن لأي شخص ترجمة جزء RFC هذا في الرمز الزائف (أو رمز PHP) و/أو الإجابة على نقطتي أعلاه؟
تحرير 1:شكرا لك سانت وولاند على إجابتك. هل يمكنك (أو أي شخص آخر) أن تخبرني إذا كنت على صواب في هذه النقاط الست:
شكل
$_SERVER['HTTP_IF_NONE_MATCH']
يمكن للإثنين:أ) إذا لم يكن هناك ما بعد المباراة: "Xyzzy" ، "R2D2XXXX" ، "C3Piozzzz"
ب) إذا لم يكن هناك ما بعد المباراة: "xyzzy"
و لا:
ج) إذا لم يكن هناك ما بعد المباراة: "xyzzy ، r2d2xxxx ، c3piozzzz"
لو
!array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)
, ، anytagmatched () إرجاع فارغة.بمجرد etag في
$_SERVER['HTTP_IF_NONE_MATCH']
تطابق المستند الخاص بي etag ، anytagmatched () إرجاع true.إذا لم يكن أي من etags في
$_SERVER['HTTP_IF_NONE_MATCH']
يطابقون مستندتي etag ،anyTagMatched()
يعود خطأ.لو
$_SERVER['HTTP_IF_MODIFIED_SINCE']
تم تعيينه ويطابق تاريخ مستند "آخر تعديل"isExpired()
إرجاع خطأ ، وإلا عد صحيح.في أقرب وقت
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 ;
}
الجواب الرئيسي هنا.