2009-10-19 36 views
52

Tôi đã cố gắng hiểu điều này và đã tìm kiếm SO cho các câu hỏi tương tự, nhưng tôi vẫn chưa hiểu 100% về cách thức hoạt động này.HTTP 304 Not Modified-response có chứa tiêu đề kiểm soát bộ nhớ cache không?

tôi nhận được phản ứng này trên một yêu cầu cho một nguồn tài nguyên hình ảnh:

Response Headers 
    Server Apache-Coyote/1.1 
    Date Mon, 19 Oct 2009 09:04:04 GMT 
    Expires Mon, 19 Oct 2009 09:06:05 GMT 
    Cache-Control public, max-age=120 
    Etag image_a70703fb393a60b6da346c112715a0abd54a3236 
    Content-Disposition inline;filename="binary-216-420" 
    Content-Type image/jpg;charset=UTF-8 
    Content-Length 4719 

Các hành vi mong muốn là khách hàng nên bộ nhớ cache này trong 120 giây, sau đó yêu cầu nó từ máy chủ một lần nữa. Trong vòng 120 giây, không yêu cầu nào được gửi đến máy chủ.

Sau đó, sau 120 giây, một yêu cầu được gửi và một phản ứng 304 nhận được:

Response Headers 
    Server Apache-Coyote/1.1 
    Date Mon, 19 Oct 2009 09:06:13 GMT 

Request Headers 
    Host localhost:8080 
    User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 
    Accept image/png,image/*;q=0.8,*/*;q=0.5 
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2 
    Accept-Encoding gzip,deflate 
    Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
    Keep-Alive 300 
    Connection keep-alive 
    Referer http://localhost:8080/cms/site/0/en/home 
    Cookie JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3 
    If-None-Match image_a70703fb393a60b6da346c112715a0abd54a3236 

Cho đến nay, tất cả tốt. Nhưng sau đó, trên yêu cầu tiếp theo (whithin 120 giây) tôi đã có thể nghĩ rằng tài nguyên nên được lưu trữ trong 120 giây mới. Những gì tôi thấy trong trình duyệt (Firefox) mặt khác, là nó từ thời điểm này trên luôn luôn yêu cầu tài nguyên và nhận được 304-phản ứng.

Tôi có nên đính kèm tiêu đề kiểm soát bộ nhớ cache trong phản hồi 304 không? Từ những gì tôi có thể đọc trong spec, nó có vẻ như các thiết lập kiểm soát bộ nhớ cache nên được bỏ qua, và rằng bộ nhớ cache nên cache nó cho 120 giây mới tự động?

Trả lời

38

Về lý thuyết bạn không cần phải gửi Cache-Control cho một 304 - người nhận nên chỉ tiếp tục sử dụng các chỉ thị bộ nhớ cache mà nó nhận được từ bản gốc 200. Tuy nhiên, như bạn đã tìm thấy, trong thực tế nếu bạn không tiếp tục gửi Cache-Control, trình duyệt sẽ bỏ qua các chỉ thị bộ nhớ cache mà bạn đã gửi ban đầu và hoàn nguyên về chẩn đoán mặc định của riêng chúng.

Vì vậy, trong thực tế, bạn nên bao gồm cùng một Cache-Control với 304 mà bạn muốn với 200.Thông số chỉ yêu cầu bạn gửi cho 304 nếu nó khác với những gì bạn đã gửi trước đó (xem 10.3.5 304 Not Modified) - nhưng chắc chắn không cấm bạn lặp lại nó khi nó giống nhau.

Và để đáp ứng đặc biệt để những điểm sai-đánh đầu từ câu trả lời khác (Cấu trúc của):

  1. Bạn làm muốn lưu trữ trung gian để cache phản ứng (có nghĩa là, cập nhật mục nhập bộ nhớ cache của họ đối với nguồn). Họ sẽ trả lời thích hợp với các yêu cầu từ khách hàng với 200 hoặc 304, tùy thuộc vào việc khách hàng có bao gồm tiêu đề có điều kiện như If-Modified-Since hay không.

  2. 120 giây ttl sẽ sẽ được làm mới thêm 304 (vì vậy cùng một khách hàng không yêu cầu một nguồn khác trong ít nhất 120 giây). Và khách hàng, miễn là họ vẫn còn có các cache nội dung, sẽ tiếp tục đưa ra yêu cầu điều kiện cho tài nguyên, mà bạn có thể tiếp tục để đáp ứng với một 304.

+3

Xem câu trả lời của Mark Nottingham dưới đây: http://stackoverflow.com/a/4393499/632951 – Pacerier

2

Nếu tôi hiểu chính xác thì trình duyệt thực tế là bộ nhớ đệm trong 120 giây và máy chủ của bạn phản hồi 304 Không được sửa đổi đối với các yêu cầu If-Modified-Since tiếp theo. Yêu cầu "IMS" này xảy ra khi người dùng cuối truy cập cùng một URL. Tại thời điểm đó, trình duyệt có thể gửi yêu cầu If-Modified-Since. Trình duyệt muốn biết liệu nó có đang hiển thị nội dung cũ hay không. Điều này có vẻ bình thường.

Khi nhận được yêu cầu này, máy chủ của bạn phải trả lời 200 OK, 304 Not Modified (hoặc 4XX nếu cần).

Tôi không tin bạn nên đặt máy chủ của mình gửi tiêu đề Bộ nhớ cache kiểm soát với phản hồi 304 vì hai lý do:
1. Bạn không muốn bất kỳ bộ đệm cache trung gian nào có phản hồi 304 (có khả năng họ có thể)
2. TTL thứ hai 120 giây sẽ không được làm mới bằng phản hồi 304. Trình duyệt sẽ giữ lại đối tượng trong 120 giây từ phản hồi 200 OK. Sau 120 giây, trình duyệt phải gửi yêu cầu GET, không phải là If-Modified-Since, do đó máy chủ của bạn sẽ phản hồi với các byte của tệp và không chỉ là phản hồi 304. Lưu ý rằng trình duyệt sẽ không tự động yêu cầu tệp sau 120 giây trừ khi người dùng cuối yêu cầu cụ thể nó thông qua tải trang hoặc nhập trực tiếp URL vào thanh địa chỉ của họ (hoặc trừ khi bạn có ứng dụng tùy chỉnh kiểm soát điều đó chức năng bằng cách nào đó).

Sửa đoạn đầu tiên để đọc một chút tốt hơn (hy vọng)

+0

Hmmm, có thể một chút không rõ ràng từ phía tôi, nhưng những gì tôi muốn đạt được: 1) Yêu cầu đầu tiên, đặt bộ nhớ cache kiểm soát bộ nhớ cache tại máy khách trong một khoảng thời gian; tối đa. 2) Khi đạt đến độ tuổi tối đa, khách hàng sẽ gửi một yêu cầu mới. 3) Nếu nội dung không thay đổi trên máy chủ, trả lời với 304. 4) Trình duyệt sẽ lưu lại bộ nhớ cache trong thời gian tối đa. 5) Khi có yêu cầu thêm sau khi độ tuổi tối đa, nhận được 304 phản hồi và gia hạn bộ nhớ cache của ứng dụng khách. Bây giờ, sau 200 tuổi và độ tuổi tối đa, nó "vòng" khi gửi yêu cầu tới máy chủ với 304 là phản hồi. Sau đó, một lần nữa, có lẽ những gì tôi muốn đạt được không phải là một cách tiếp cận hợp lệ? – runarM

+0

Đây là số của tôi: 1) Yêu cầu đầu tiên, 200 OK, Bộ kiểm soát bộ nhớ cache qua độ tuổi tối đa. 2) * Nếu * khách hàng thực hiện một yêu cầu tiếp theo sau khi tệp cũ, nó sẽ thực hiện một yêu cầu GET. Nếu không, yêu cầu IMS. 3) Nếu yêu cầu GET, 200 OK. Nếu IMS, 304 không được sửa đổi hoặc 200 OK. 4) Tái lưu trữ tập tin, hoặc giữ lại bản sao hiện tại cho đến khi độ tuổi tối đa hết hạn và nó được yêu cầu một lần nữa, trong trường hợp đó đi đến # 1 ở trên. 5) Không có số 5. :) Nếu mục tiêu của bạn là để người dùng cuối giữ tệp càng lâu càng tốt và chỉ sử dụng 304 câu trả lời (và bạn sẽ không cập nhật tệp) thì tôi đề xuất độ tuổi tối đa dài hơn nhiều. – Structure

+0

Để thêm vào nhận xét cuối cùng của tôi. Tôi không thấy gì trong RFC nói rằng phương pháp của bạn sẽ không hoạt động hoặc không hợp lệ. Tuy nhiên, từ ngữ cho thấy nó không có ý định làm việc theo cách đó. "yêu cầu" trong RFC đề xuất yêu cầu GET. Một 304 được trả về theo yêu cầu If-Modified-Since, được sử dụng để xác thực bộ nhớ cache. Không có dấu hiệu cho thấy một tiêu đề Cache-Control có thể được bao gồm trong một phản hồi 304 để cập nhật các tiêu đề của một tập tin hiện đang trong bộ nhớ đệm. Nó cho thấy tiêu đề Cache-Control thường được thiết lập với đáp ứng với yêu cầu GET tiêu chuẩn. – Structure

45

RFC7232 cập nhật RFC2616 để nói :

các máy chủ tạo ra một phản ứng 304 pHẢI tạo ra bất kỳ của lĩnh vực tiêu đề sau đây mà có thể đã được gửi đi trong một 200 (OK) phản ứng với cùng yêu cầu: cache-Control, Content-Vị trí, ngày, ETag, Hết hạn và Thay đổi.

+0

Có phải 120 giây trong độ tuổi tối đa được làm mới bởi 304 (như đã nêu trong Justin ở đoạn cuối)? Hoặc là * thời hạn xác nhận * không được làm mới bằng phản hồi 304? – Pacerier

+0

@Pacerier nếu bạn gửi cùng một giá trị tiêu đề như thể nó là 200, thì có nó sẽ được làm mới. – OrangeDog

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