2010-01-18 21 views
8

Câu hỏi của tôi là về cách trả lời HTTP 304 "Không được sửa đổi" khi tôi nhận được cả hai nếu không khớp và nếu được sửa đổi- kể từ khi yêu cầu proxy/ứng dụng khách.HTTP if-none-match và if-modified-since và 304 clarification trong PHP

Từ RFC 2616 secttion 14,26 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26):

Nếu không có trận đấu thẻ thực thể, sau đó máy chủ có thể thực hiện các yêu cầu phương pháp như If-None-Match tiêu đề lĩnh vực không tồn tại, nhưng PHẢI cũng bỏ qua bất kỳ tiêu đề If-Modified-Since trường nào trong yêu cầu. Tức là, nếu không có thẻ tổ chức nào phù hợp thì máy chủ PHẢI KHÔNG trả lại phản hồi 304 (Không được sửa đổi) .

Tôi không chắc chắn để hiểu tuyên bố này ...

  1. "Nếu không có trận đấu thẻ thực thể" trong PHP Họ nói về $_SERVER['HTTP_IF_NONE_MATCH'] vs ETags của tôi rằng tôi đã gửi trước đó?
  2. Nếu tôi hiểu chính xác tuyên bố này, ngay khi không có thẻ ET được liệt kê trong số $_SERVER['HTTP_IF_NONE_MATCH'] khớp với thẻ ET của tôi, tôi sẽ ngừng tất cả xác minh và phục vụ trang bình thường.

Bất kỳ ai cũng có thể dịch phần RFC này thành mã giả (hoặc mã PHP) và/hoặc trả lời 2 điểm trên của tôi?

CHỈNH SỬA 1: Cảm ơn bạn St.Woland cho câu trả lời của bạn. bạn (hoặc bất cứ ai khác) có thể cho tôi biết nếu tôi đúng vào những 6 điểm:

  1. Định dạng của $_SERVER['HTTP_IF_NONE_MATCH'] có thể là:

    a) Nếu-Không-Khớp: "xyzzy", "r2d2xxxx", "c3piozzzz"

    b) Nếu-Không-Khớp: "xyzzy"

    và KHÔNG:

    c) Nếu-Không-Khớp: "xyzzy, r2 d2xxxx, c3piozzzz "

  2. Nếu !array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER), anyTagMatched() trả về NULL.

  3. Ngay sau khi một ETag trong $_SERVER['HTTP_IF_NONE_MATCH'] khớp với tài liệu ETag của tôi, anyTagMatched() trả về TRUE.

  4. Nếu không có Etags nào trong $_SERVER['HTTP_IF_NONE_MATCH'] khớp với tài liệu ETag của tôi, anyTagMatched() trả về FALSE.

  5. Nếu $_SERVER['HTTP_IF_MODIFIED_SINCE'] được đặt và khớp với tài liệu "sửa đổi lần cuối" ngày isExpired() trả về FALSE, nếu không sẽ trả về TRUE.

  6. Ngay sau khi anyTagMatched() trả về TRUE, tôi phát hành 304. Nếu anyTagMatched() trả về NULL và isExpired() trả về FALSE tôi có thể phát hành 304.Trong bất kỳ tình huống nào khác, tôi phục vụ trang của mình như bình thường (tôi cũng phát hành các tiêu đề Cập nhật lần cuối và Thay đổi ETAG mới nhất).

+0

Hãy xem tại địa chỉ: - http://stackoverflow.com/questions/2000715/answering-httpifmodifiedsince-and-httpifnonematch-in-php - http://stackoverflow.com/questions/1583740/304- not-modified-and-front-end-caching –

+1

Theo định nghĩa, một giá trị không được trích dẫn không hợp lệ (xem http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11). – Gumbo

+0

Điều tuyệt vời cần biết, tôi nên tìm hiểu để đọc các định nghĩa trường trong RFC! Điểm "1-C" vẫn không hợp lệ? – AlexV

Trả lời

5

Điều này sẽ được đặt cuối cùng (được di chuyển để có giao diện đẹp hơn).

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

Mã giả (xem xét cần thiết):

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

câu trả lời chính here.

+0

Trong hàm isExpired() nếu $ if_modified_since == false? Hàm này không trả về bất cứ điều gì ... – AlexV

+0

Nó rõ ràng sẽ trả về 'true', vì tiêu đề IF-MODIFIED-SINCE không được thiết lập. Tôi đã thay đổi mã cho phù hợp. Xin lỗi vì điều đó, nó thực sự cần một kiểm tra sâu hơn, nhưng đó là những gì bạn đã yêu cầu: giả mã. –

+0

Đã thêm "EDIT 1" được đề cập. Nó sẽ là tuyệt vời nếu bạn có thời gian để xác nhận điểm của tôi. Cảm ơn nhiều! – AlexV

Các vấn đề liên quan