2008-10-15 20 views

Trả lời

0

Bạn có thể sử dụng tiêu đề phản hồi http một cách chính xác nhưng thường bị bỏ qua.

Nếu không, lưu trữ md5-băm cục bộ của nội dung có thể hữu ích cho bạn (trừ khi có chuỗi nội dung dễ dàng hơn bạn có thể móc ra). Nó không lý tưởng (vì nó là một quá trình khá chậm) nhưng đó là một lựa chọn.

0

Có, bạn có thể và nên sử dụng tiêu đề HTTP để đánh dấu các trang là chưa hết hạn. Nếu chúng là động mặc dù (PHP, ASPX, vv) và/hoặc cơ sở dữ liệu điều khiển, bạn sẽ cần phải tự kiểm soát thiết lập các tiêu đề hết hạn/gửi HTTP không sửa đổi một cách thích hợp. ASP.NET có một số đối tượng SqlDependency cho điều này, nhưng chúng vẫn cần phải được cấu hình và quản lý. (Không chắc liệu PHP có gì đó giống như nó không, nhưng có lẽ có gì đó trong PEAR nếu không ...)

1

Đây là mục đích chính xác của tiêu đề ETag, nhưng nó phải được khung web của bạn hỗ trợ hoặc bạn cần lưu ý rằng ứng dụng của bạn phản hồi đúng yêu cầu với tiêu đề Nếu so khớp, Nếu không khớpNếu phạm vi (xem HTTP Ch 3.11).

0

Tiêu đề Last-Modified sẽ chỉ được sử dụng cho bạn nếu người lập trình trang web đã đặt rõ ràng tiêu đề để được trả lại.

Đối với trang tĩnh, thông thường Last-Modified là dấu thời gian của sửa đổi cuối cùng của tệp HTML. Đối với một trang được tạo động, máy chủ không thể gán giá trị Last-Modified một cách đáng tin cậy vì nó không có cách nào thực sự biết được nội dung đã thay đổi như thế nào tùy theo yêu cầu, vì vậy nhiều máy chủ không tạo tiêu đề.

Nếu bạn có quyền kiểm soát trang, sau đó đảm bảo tiêu đề Sửa đổi lần cuối được đặt sẽ đảm bảo séc trên Last-Modified thành công. Nếu không, bạn có thể phải tìm nạp trang và thực hiện regex để tìm phần đã thay đổi (ví dụ: ngày/giờ trong tiêu đề của trang web tin tức). Nếu không có dấu hiệu rõ ràng như vậy tồn tại, sau đó tôi muốn số thứ hai Oli's suggestion của MD5 trên nội dung trang như một cách để chắc chắn rằng nó đã thay đổi.

2

Mặc dù bạn có thể nghĩ rằng nó đã lỗi thời, tôi luôn tìm thấy bài viết của Simon Willison trên Conditional GET để hữu ích hơn. Ví dụ là trong PHP nhưng nó đơn giản đến nỗi bạn có thể thích nghi nó với các ngôn ngữ khác. Dưới đây là ví dụ:

function doConditionalGet($timestamp) { 
    // A PHP implementation of conditional get, see 
    // http://fishbowl.pastiche.org/archives/001132.html 
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 
    $etag = '"'.md5($last_modified).'"'; 

    // Send the headers 
    header("Last-Modified: $last_modified"); 
    header("ETag: $etag"); 

    // See if the client has provided the required headers 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false; 

    if (!$if_modified_since && !$if_none_match) { 
     return; 
    } 

    // At least one of the headers is there - check them 
    if ($if_none_match && $if_none_match != $etag) { 
     return; // etag is there but doesn't match 
    } 

    if ($if_modified_since && $if_modified_since != $last_modified) { 
     return; // if-modified-since is there but doesn't match 
    } 

    // Nothing has changed since their last request - serve a 304 and exit 
    header('HTTP/1.0 304 Not Modified'); 
    exit; 
} 

Với điều này bạn có thể sử dụng động từ HTTP GET hoặc HEAD (Tôi nghĩ rằng nó cũng có thể với others, nhưng tôi không thể nhìn thấy lý do để sử dụng chúng). Tất cả những gì bạn cần làm là thêm If-Modified-Since hoặc If-None-Match với các giá trị tương ứng của tiêu đề Last-Modified hoặc ETag được gửi bởi phiên bản trước của trang. Kể từ phiên bản HTTP 1.1, bạn nên sử dụng ETag trên Last-Modified, nhưng cả hai đều sẽ thực hiện công việc.

Đây là một ví dụ rất đơn giản về cách thức hoạt động của GET có điều kiện.Đầu tiên chúng ta cần phải lấy trang theo cách thông thường:

GET /some-page.html HTTP/1.1 
Host: example.org

phản ứng đầu tiên với tiêu đề có điều kiện và nội dung:

200 OK 
ETag: YourETagHere

Bây giờ get có điều kiện yêu cầu:

GET /some-page.html HTTP/1.1 
Host: example.org 
If-None-Match: YourETagHere

Và câu trả lời cho thấy bạn có thể sử dụng phiên bản được lưu trong bộ nhớ cache của trang, vì chỉ các tiêu đề sẽ được phân phối:

304 Not Modified 
ETag: YourETagHere

Với điều này, máy chủ thông báo cho bạn rằng không có sửa đổi nào đối với trang.

Tôi cũng có thể giới thiệu cho bạn một bài viết khác về GET có điều kiện: HTTP conditional GET for RSS hackers.

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