2017-09-21 33 views
5

Tôi có nghi ngờ về hành vi max-age sau khi đọc Bộ nhớ cache Http rfc.Tác nhân người dùng có thể đặt độ tuổi tối đa lớn hơn 0 trong yêu cầu của nó không?

Kịch bản:

Tác nhân người dùng

GET /foo 

xứ Server Response tiêu đề

cache-control: max-age=120 

máy chủ nói với user agent rằng tài nguyên yêu cầu phải được xác nhận lại sau 2 phút.

Sau 1 phút và vài giây, đại diện người dùng làm cho một yêu cầu khác, xác định một max-age 1 phút:

đại diện người dùng

cache-control: max-age=60 
GET /foo 

Từ những gì tôi hiểu, yêu cầu này nên bỏ qua người dùng bộ nhớ cache của tác nhân.
Tại sao?
Mặc dù Máy chủ gốc cho khách hàng biết rằng tài nguyên sẽ được lưu trong bộ nhớ cache trong 2 phút, Tác nhân người dùng cần một tài nguyên có thời lượng tối đa là 1 phút (max-age = 60).
Sau 1 phút và vài giây từ GET đầu tiên, tài nguyên đó không hợp lệ (từ quan điểm User Agent) và yêu cầu sẽ chuyển thẳng đến máy chủ gốc (Hoặc bất kỳ lớp bộ nhớ cache nào khác).

Tôi có đúng không? Có thể chỉ định, từ Tác nhân người dùng, một số max-age lớn hơn 0 không? Có hỗ trợ/được vinh danh bởi các trình duyệt thông dụng không?

Tôi làm việc ở đâu, chúng tôi có cơ chế lưu bộ nhớ cache tùy chỉnh .NET hoạt động như thế này; khách hàng có thể chỉ định một max-age khi họ cần một tài nguyên từ bộ nhớ cache là "AT MOST" X giây cũ.

Trả lời

5

Không cần bất kỳ nghi ngờ gì. RFC7234 Section 5.2.1.1 bao gồm ví dụ max-age=5, tất nhiên là lớn hơn 0. Định nghĩa cũng là rõ ràng (tôi nhấn mạnh):

Các "max-age" yêu cầu chỉ thị chỉ ra rằng khách hàng là không muốn chấp nhận một phản ứng có độ tuổi lớn hơn số quy định của giây.

"Số giây được chỉ định" có thể là bất kỳ số nguyên không âm nào (được xác định trong Section 1.2.1). Vì vậy, câu trả lời là có xác định.

Ngoài ra, định nghĩa tôi đã trích dẫn ở trên cũng giải thích hành vi bộ nhớ cache trong kịch bản của bạn. Nhưng trước khi tôi nhận được điều đó, tôi nên sửa các điều sau:

Máy chủ cho người dùng biết rằng tài nguyên được yêu cầu sẽ được xác nhận lại sau 2 phút.

Không chính xác.

Chỉ thị max-age=120 có nghĩa là máy chủ cho tất cả bộ nhớ cache, chứ không phải tác nhân người dùng, rằng phản hồi phải được xem là cũ sau 2 phút. Từ Section 5.2.2.8 (tôi nhấn mạnh):

Các "max-age" chỉ thị phản ứng chỉ ra rằng phản ứng là được xem xét cũ sau tuổi của nó lớn hơn số quy định của giây.

Như bạn thấy, không có yêu cầu xác nhận lại. Nếu không có yêu cầu nào cho cùng một tài nguyên cho đến 10 phút sau, sẽ không có bất kỳ xác nhận lại nào cho đến 10 phút sau đó.

Ngoài ra, từ Section 5.2 (tôi nhấn mạnh):

Các "Cache-Control" header field được sử dụng để xác định các chỉ thị cho cache dọc theo chuỗi request/response.

Chỉ bộ nhớ cache chứ không phải tác nhân người dùng.

Mỗi người tham gia trong chuỗi yêu cầu/phản hồi nhận được cùng một phản hồi với cùng tiêu đề Bộ nhớ cache kiểm soát, nhưng người nhận đích của tiêu đề Bộ nhớ cache-Kiểm soát chỉ là bộ đệm. Hãy nhớ rằng, chỉ vì bạn nhận được nó, không có nghĩa là nó là dành cho bạn.

Đối với phần còn lại của kịch bản, đánh giá của bạn là chính xác. tôi sẽ báo giá nó ở đây:

Sau 1 phút và vài giây, đại diện người dùng làm cho một yêu cầu khác, xác định một max-age 1 phút:

...

Từ những gì tôi hiểu, yêu cầu này sẽ bỏ qua bộ nhớ cache của tác nhân người dùng. Tại sao?

Do tại thời điểm yêu cầu, độ tuổi của phản hồi được lưu trữ lớn hơn 60 giây. Rõ ràng là nếu tuổi của một phản ứng được lưu trữ là, 65 giây, nó không thể được sử dụng để đáp ứng một yêu cầu với chỉ thị max-age=60. Do đó, bộ nhớ cache chỉ tuân theo chỉ thị mà nó nhận được.

Trong thực tế, bất kỳ tiêu chuẩn phù hợp HTTP Cache liệu tích hợp trong trình duyệt hoặc tách được yêu cầu phải tuân theo chỉ thị mà nó nhận được, như đã nêu trong Section 5.2 (nhấn mạnh chữ hoa từ nguồn, không phải của tôi):

Một bộ nhớ cache PHẢI tuân thủ các yêu cầu của các chỉ thị Cache-Control được xác định trong phần này.

Dựa trên những gì bạn đã mô tả, cơ chế lưu bộ nhớ cache tùy chỉnh bạn làm việc có vẻ tuân thủ các tiêu chuẩn. Vì vậy, bổ sung của tôi cho các nhà phát triển, đặc biệt là nếu "tùy chỉnh", bạn có nghĩa là "phát triển trong nhà".

+0

Đây là một câu trả lời tuyệt vời! Tôi đã đơn giản hoá kịch bản nói về User Agent (nhưng tôi có nghĩa là cache của User Agent và tất cả các cache liên quan đến roundtrip); bạn đúng về điều "xác nhận lại", nó nói đúng hơn về phản ứng cũ. – systempuntoout

1

Từ RFC2616max-age

When an intermediate cache is forced, by means of a max-age=0 
    directive, to revalidate its own cache entry, and the client has 
    supplied its own validator in the request, the supplied validator 
    might differ from the validator currently stored with the cache 
    entry. In this case, the cache MAY use either validator in making 
    its own request without affecting semantic transparency. 

    However, the choice of validator might affect performance. The 
    best approach is for the intermediate cache to use its own 
    validator when making its request. If the server replies with 304 
    (Not Modified), then the cache can return its now validated copy 
    to the client with a 200 (OK) response. If the server replies with 
    a new entity and cache validator, however, the intermediate cache 
    can compare the returned validator with the one provided in the 
    client's request, using the strong comparison function. If the 
    client's validator is equal to the origin server's, then the 
    intermediate cache simply returns 304 (Not Modified). Otherwise, 
    it returns the new entity with a 200 (OK) response. 

    If a request includes the no-cache directive, it SHOULD NOT 
    include min-fresh, max-stale, or max-age. 

Từ dòng cuối cùng của RFC:

Nếu yêu cầu bao gồm các chỉ thị no-cache, nó KHÔNG NÊN bao gồm min- tươi, tối đa hoặc tối đa.

Từ 13.2.6 Disambiguating Multiple Responses section

When a client tries to revalidate a cache entry, 
and the response it receives contains a Date header that 
appears to be older than the one for the existing entry, 
then the client SHOULD repeat the request 
unconditionally, and include 

    Cache-Control: max-age=0 

to force any intermediate caches to validate their copies directly with the origin server, or 

    Cache-Control: no-cache 

to force any intermediate caches to obtain a new copy from the origin server. 

If the Date values are equal, then the client MAY use either response 
(or MAY, if it is being extremely prudent, request a new response). 
Servers MUST NOT depend on clients being able to choose 
deterministically between responses generated during the same 
second, if their expiration times overlap. 

sự hiểu biết của tôi là từ phía khách hàng (user agent) max-age=0 có thể được sử dụng như một cơ chế để sử dụng phiên bản lưu trữ mới nhất, trái ngược với no-cache, mà sẽ tìm nạp lại các nguồn.

curl -I -H 'Cache-Control: no-cache' http://example.com 

Do đó nếu sử dụng max-age với một giá trị lớn hơn zero thay vào đó nên sử dụng phiên bản lưu trữ phù hợp với phần chênh lệch giữa ngày nhận được trong tiêu đề một giá trị được định nghĩa trong max-age.

Không chắc chắn Nếu tôi righ nhưng là tôi undestandit.

Bổ sung câu hỏi tương tự: What's the difference between Cache-Control: max-age=0 and no-cache?

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