Sự khác biệt giữa các tiêu đề thực dụng và kiểm soát bộ nhớ cache?


166

tôi đọc về pragma tiêu đề trên Wikipedia mà nói:

"Trường tiêu đề thực dụng: không có bộ đệm là tiêu đề HTTP / 1.0 dành cho sử dụng trong các yêu cầu. Đây là phương tiện để trình duyệt thông báo cho máy chủ và bất kỳ bộ đệm trung gian nào mà nó muốn có phiên bản mới của tài nguyên, không phải cho máy chủ để bảo trình duyệt không lưu trữ tài nguyên. Một số tác nhân người dùng chú ý đến tiêu đề này trong các phản hồi, nhưng RFC HTTP / 1.1 đặc biệt cảnh báo không nên dựa vào hành vi này. "

Nhưng tôi không hiểu nó làm gì? Sự khác biệt giữa Cache-Controltiêu đề có giá trị là gì no-cachePragmagiá trị của ai cũng là no-cachegì?

Câu trả lời:


196

Pragmalà triển khai HTTP / 1.0 và cache-controllà triển khai HTTP / 1.1 của cùng một khái niệm. Cả hai đều có nghĩa là để ngăn khách hàng lưu trữ phản hồi. Các máy khách cũ hơn có thể không hỗ trợ HTTP / 1.1, đó là lý do tại sao tiêu đề đó vẫn được sử dụng.


31
Mặc dù câu trả lời của cnst dưới đây phức tạp hơn nhiều, nhưng nó cũng đúng hơn nhiều theo đặc điểm kỹ thuật. Pragma: no-cacheđược dự định chỉ được sử dụng trong các yêu cầu (có nghĩa là "Tôi muốn bản gốc, không phải bản sao được lưu trong bộ nhớ cache") và hành vi của nó không được chỉ định cho các phản hồi.
clime

5
Cache-Control: no-cachecó cùng ý nghĩa đối với các yêu cầu nhưng thực ra cũng được xác định cho các phản hồi, nghĩa là "Nếu bạn muốn sử dụng một bản sao được lưu trong bộ nhớ cache này trong tương lai, trước tiên bạn phải kiểm tra với tôi rằng nó đã được cập nhật (nghĩa là thực hiện xác nhận lại)".
clime

3
Đó là cho Kiểm soát bộ đệm, nó không phải CHỈ để ngăn chặn bộ đệm, nó cũng có thể được sử dụng để nói "Bạn có thể lưu trữ bộ đệm này." ....
jave.web

Câu trả lời cơ bản. Để làm cho nó phức tạp hơn: Đây cũng là một tiêu đề yêu cầu, có nghĩa là bạn cũng có thể gửi no-cache đến máy chủ. Và điều đó thực sự có thể có nghĩa là trả lại nội dung cũ cho khách hàng, CÁI GÌ ?? Bây giờ bạn quên điều này và đọc câu trả lời đơn giản ở trên và tận hưởng cuộc sống của bạn, đừng đào quá khó lol
sotn

Cả hai đều có nghĩa là để ngăn khách hàng lưu vào bộ nhớ cache phản hồi là một lưu ý khó hiểu cho độc giả. Nó cũng có max-agethể không ngăn chặn bộ nhớ đệm. Nó chỉ đặt ngày hết hạn cho nó ...
Honey

97

Không có sự khác biệt, ngoại trừ Pragmachỉ được xác định là có thể áp dụng cho các yêu cầu của khách hàng, trong khi đó Cache-Controlcó thể được sử dụng bởi cả yêu cầu của khách hàng và trả lời của máy chủ.

Vì vậy, theo tiêu chuẩn, chúng chỉ có thể được so sánh từ góc độ của khách hàng thực hiện một yêu cầu và máy chủ nhận được yêu cầu từ khách hàng. Các http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 định nghĩa kịch bản như sau:

Bộ nhớ cache HTTP / 1.1 NÊN xử lý "Thực dụng: không có bộ đệm" như thể máy khách đã gửi "Kiểm soát bộ đệm: không có bộ đệm". Không có chỉ thị thực dụng mới nào sẽ được xác định trong HTTP.

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

Cách tôi sẽ đọc ở trên:

  • nếu bạn đang viết một khách hàng và cần no-cache:

    • chỉ sử dụng Pragma: no-cachetrong các yêu cầu của bạn, vì bạn có thể không biết liệu Cache-Controlcó được máy chủ hỗ trợ hay không;
    • nhưng trong phần trả lời, để quyết định xem có nên lưu vào bộ đệm hay không, hãy kiểm tra Cache-Control
  • nếu bạn đang viết một máy chủ:

    • trong phân tích yêu cầu từ khách hàng, kiểm tra Cache-Control; nếu không tìm thấy, hãy kiểm tra Pragma: no-cachevà thực hiện Cache-Control: no-cachelogic;
    • trong trả lời, cung cấp Cache-Control.

Tất nhiên, thực tế có thể khác với những gì được viết hoặc ngụ ý trong RFC!


5
Nếu tiêu đề có cả hai thì sao? Cache-Control: max-age=86400Pragma: no-cache? Cái nào sau đó sẽ được vinh danh bởi các trình duyệt hiện đại?
PKHunter

3
@PKHunter, tại sao bạn lại quan tâm nó sẽ đi theo hướng nào nếu hành vi không được xác định? Nếu bạn chịu trách nhiệm cho máy chủ, rõ ràng bạn có thể làm tốt hơn là cung cấp thông tin sai lệch cho khách hàng. Ngoài ra, như được chỉ ra trong câu trả lời của tôi, Pragma: no-cachechỉ được xác định cho các yêu cầu từ trình duyệt và do đó nó sẽ hoàn toàn không hợp lệ và không được xác định trong các phản hồi từ máy chủ đến trình duyệt, ví dụ: tôi tưởng tượng rằng mọi trình duyệt đơn lẻ (dù hiện đại hay hiện đại không) nên bỏ qua tiêu đề như vậy trong bất kỳ câu trả lời nào mà nó có thể nhận được.
cnst

3
Một trình duyệt hiện đại nên bỏ qua thực tế có lợi cho Kiểm soát bộ đệm nếu cả hai đều có mặt vì trình duyệt sau có thể chỉ định khoảng thời gian và thông tin khác không có sẵn trong giao thức 1.0 ban đầu.
Randall Borck

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

Nếu đó là sau năm 1999, và bạn vẫn đang sử dụng Hết hạn hoặc pragma , bạn đang làm nó sai.

Tôi đang nhìn bạn Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: Pragmalà một di sản của HTTP / 1.0 và không cần thiết kể từ Internet Explorer 5 hoặc Netscape 4.7. Trừ khi bạn mong đợi một số người dùng của bạn sẽ sử dụng IE5: sẽ an toàn khi ngừng sử dụng nó.


  • Hết hạn: [date] (không dùng nữa - HTTP 1.0)
  • Thực tế: không có bộ đệm (không dùng nữa - HTTP 1.0)
  • Kiểm soát bộ nhớ cache: max-age =[seconds]
  • Kiểm soát bộ đệm : không có bộ đệm (phải xác thực lại bản sao được lưu trong bộ nhớ cache mỗi lần)

Và các yêu cầu có điều kiện:

  • Etag (thẻ thực thể) dựa trên yêu cầu có điều kiện
    • Người phục vụ: Etag: W/“1d2e7–1648e509289”
    • Khách hàng: If-None-Match: W/“1d2e7–1648e509289”
    • Người phục vụ: 304 Not Modified
  • Ngày sửa đổi dựa trên yêu cầu có điều kiện
    • Người phục vụ: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Khách hàng: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Người phục vụ: 304 Not Modified

sửa đổi lần cuối: Thu, 09 tháng 5 năm 2019 19:15:47 GMT


2
RFC nói rằng bạn nên sử dụng cả hai trong trường hợp khách hàng không hỗ trợ Kiểm soát bộ đệm
Randall Borck

3
Máy khách "phải" bao gồm cả hai - trừ khi nó muốn xử lý các máy chủ bộ đệm HTTP / 1.1 và HTTP / 1.0 khác nhau. Các máy chủ không nên bao gồm Pragmatất cả. (Trong HTTP / 1.0, Pragma được định nghĩa là trường mở rộng cho các chỉ thị được chỉ định triển khai cho người nhận. Đặc điểm kỹ thuật này không dùng các phần mở rộng đó để cải thiện khả năng tương tác.)
Ian Boyd

2
Từ quan điểm bảo mật, nên sử dụng nó. Nhiều trình duyệt tuân theo chỉ thị pragma: no-cache, do đó, nên sử dụng nó bởi OWASP: owasp.org/index.php/ Kẻ
Randall Borck

2
@RandallBorck: Bạn đang lan truyền thông tin lỗi thời (bởi hai thập kỷ, không hơn không kém!). Không có trình duyệt nào tuân theo chỉ thị thực dụng nữa, trừ khi đó là năm 1999. Đây là lời khuyên sùng bái hàng hóa: "nó không bị tổn thương và chúng tôi luôn thực hiện nó, do đó nó tốt và cần thiết."
Piskvor rời khỏi tòa nhà vào

2
@Piskvor Hầu hết các máy chủ vẫn hỗ trợ cả 1.0 và 1.1, vì vậy trừ khi bạn chủ động chặn các yêu cầu HTTP / 1.0, bạn không chọn giao thức nào mà máy khách đang sử dụng. Hầu hết các nhà phát triển ngày nay không bận tâm đến việc chặn 1.0, do đó, đây vẫn là một cách tốt nhất, ngay cả trong năm 2019.
Randall Borck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.