ความแตกต่างระหว่างส่วนหัว Pragma และการควบคุมแคชคืออะไร?


166

ฉันอ่านเกี่ยวกับส่วนหัวของPragmaบนWikipediaซึ่งระบุว่า:

"ฟิลด์ส่วนหัวของ Pragma: no-cache เป็นส่วนหัว HTTP / 1.0 สำหรับใช้ในการร้องขอเป็นวิธีที่เบราว์เซอร์จะบอกเซิร์ฟเวอร์และแคชกลางใด ๆ ที่ต้องการทรัพยากรรุ่นใหม่ไม่ใช่สำหรับเซิร์ฟเวอร์ เพื่อบอกเบราว์เซอร์ไม่ให้แคชทรัพยากรเอเจนต์ผู้ใช้บางรายให้ความสนใจกับส่วนหัวนี้ในการตอบกลับ แต่ HTTP / 1.1 RFC เตือนเป็นการเฉพาะจากการพึ่งพาพฤติกรรมนี้ "

แต่ฉันไม่เข้าใจว่ามันทำอะไร? ความแตกต่างระหว่างCache-Controlส่วนหัวที่มีค่าคืออะไรno-cacheและPragmaมีค่าคือno-cacheอะไร?

คำตอบ:


196

Pragmaเป็นการใช้งาน HTTP / 1.0 และcache-controlเป็นการนำ HTTP / 1.1 ของแนวคิดเดียวกันมาใช้ พวกเขาทั้งสองมีวัตถุประสงค์เพื่อป้องกันไม่ให้ลูกค้าแคชตอบสนอง ไคลเอ็นต์ที่เก่ากว่าอาจไม่สนับสนุน HTTP / 1.1 ซึ่งเป็นสาเหตุที่ส่วนหัวนั้นยังใช้งานอยู่


31
แม้ว่าคำตอบของ cnst ด้านล่างนั้นมีความซับซ้อนมากขึ้น แต่ก็มีความถูกต้องมากขึ้นตามข้อกำหนด Pragma: no-cacheมีวัตถุประสงค์เพื่อใช้ในคำขอเท่านั้น (หมายถึง "ฉันต้องการต้นฉบับไม่ใช่สำเนาแคช") และไม่ได้ระบุพฤติกรรมของมันไว้สำหรับการตอบกลับ
clime

5
Cache-Control: no-cacheมีความหมายเหมือนกันสำหรับคำขอ แต่มีการกำหนดจริงสำหรับการตอบสนองความหมาย "หากคุณต้องการใช้สำเนาแคชนี้ในอนาคตคุณต้องตรวจสอบกับฉันก่อนว่าเป็นข้อมูลล่าสุด (เช่นทำการตรวจสอบความถูกต้อง)"
clime

3
มันมีไว้สำหรับการควบคุมแคชมันไม่จำเป็นต้องเป็นเพียงการป้องกันแคชเท่านั้นมันยังสามารถใช้เพื่อพูดว่า "คุณสามารถแคชได้" ....
jave.web

คำตอบพื้นฐาน เพื่อให้มันซับซ้อนมากขึ้น: มันเป็นส่วนหัวคำขอซึ่งหมายความว่าคุณสามารถส่งแคชไปยังเซิร์ฟเวอร์ได้เช่นกัน และนั่นอาจหมายถึงการส่งคืนเนื้อหาเก่าให้กับลูกค้าว่าอะไร ตอนนี้คุณลืมเรื่องนี้และอ่านข้างต้นคำตอบที่ง่ายและสนุกกับชีวิตของคุณไม่ได้ขุดมันยากเกินไปฮ่า ๆ
sotn

พวกเขาทั้งสองมีวัตถุประสงค์เพื่อป้องกันไม่ให้ลูกค้าแคชคำตอบคือโน้ตที่สับสนสำหรับผู้อ่าน มันสามารถมีmax-ageที่ไม่ป้องกันการแคช มันก็กำหนดวันหมดอายุมัน ...
น้ำผึ้ง

97

ไม่มีความแตกต่างยกเว้นว่าPragmaจะถูกกำหนดให้ใช้ได้เฉพาะกับคำร้องขอของลูกค้าในขณะที่Cache-Controlอาจถูกใช้โดยคำขอของลูกค้าและการตอบกลับของเซิร์ฟเวอร์

ดังนั้นเท่าที่มาตรฐานไปพวกเขาสามารถเปรียบเทียบได้จากมุมมองของลูกค้าทำให้การร้องขอและเซิร์ฟเวอร์ที่ได้รับการร้องขอจากลูกค้า http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32กำหนดสถานการณ์ดังต่อไปนี้:

แคช HTTP / 1.1 ควรปฏิบัติต่อ "Pragma: no-cache" ราวกับว่าลูกค้าได้ส่ง "Cache-Control: no-cache" จะไม่มีการกำหนดคำสั่ง Pragma ใหม่ใน 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

วิธีที่ฉันจะอ่านข้างต้น:

  • หากคุณกำลังเขียนลูกค้าและต้องการno-cache:

    • เพียงแค่ใช้Pragma: no-cacheในคำขอของคุณเนื่องจากคุณอาจไม่รู้ว่าCache-Controlเซิร์ฟเวอร์นั้นรองรับหรือไม่
    • แต่ในการตอบกลับหากต้องการตัดสินใจว่าจะแคชหรือไม่ให้ตรวจสอบ Cache-Control
  • หากคุณกำลังเขียนเซิร์ฟเวอร์:

    • ในการแยกวิเคราะห์คำขอจากลูกค้าตรวจสอบCache-Control; หากไม่พบตรวจสอบPragma: no-cacheและดำเนินการCache-Control: no-cacheตรรกะ;
    • Cache-Controlในการตอบให้

แน่นอนความเป็นจริงอาจแตกต่างจากสิ่งที่เขียนหรือบอกเป็นนัยใน RFC!


5
เกิดอะไรขึ้นถ้าส่วนหัวมีทั้งคู่ Cache-Control: max-age=86400และ Pragma: no-cache? เบราว์เซอร์สมัยใหม่รุ่นใดที่จะได้รับการยกย่อง
PKHunter

3
@PKHunter ทำไมคุณถึงสนใจว่ามันจะไปทางไหนถ้าพฤติกรรมนั้นไม่ได้กำหนดไว้? หากคุณรับผิดชอบต่อเซิร์ฟเวอร์คุณสามารถทำได้ดีกว่าให้ข้อมูลที่หลอกลวงแก่ลูกค้า นอกจากนี้ตามที่ระบุไว้ในคำตอบของฉันPragma: no-cacheมีการกำหนดไว้สำหรับการร้องขอจากเบราว์เซอร์เท่านั้นและจะไม่ถูกต้องทั้งหมดและไม่ได้กำหนดไว้ในการตอบกลับจากเซิร์ฟเวอร์ไปยังเบราว์เซอร์เช่นฉันคิดว่าทุกเบราว์เซอร์เดียว ไม่) ควรละเว้นหัวข้อดังกล่าวในการตอบกลับใด ๆ ที่อาจได้รับ
cnst

3
เบราว์เซอร์ที่ทันสมัยควรละเว้น Pragma ซึ่งเป็นที่โปรดปรานของ Cache-Control หากทั้งคู่มีอยู่เพราะหลังสามารถระบุช่วงเวลาและข้อมูลอื่น ๆ ที่ไม่สามารถใช้ได้ในโปรโตคอลเริ่มต้น 1.0
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          |

หากหลังจากปี 1999 และคุณยังคงใช้ExpiresหรือPragma แสดงว่าคุณทำผิด

ฉันมองไปที่คุณ 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: Pragmaเป็นมรดกของ HTTP / 1.0 และไม่ต้องการตั้งแต่ Internet Explorer 5 หรือ Netscape 4.7 หากคุณไม่คาดหวังให้ผู้ใช้บางคนใช้ IE5: ปลอดภัยที่จะหยุดใช้


  • หมดอายุ: [date] (คัดค้าน - HTTP 1.0)
  • Pragma:ไม่มีแคช(คัดค้าน - HTTP 1.0)
  • การควบคุมแคช: max-age =[seconds]
  • การควบคุมแคช:ไม่มีแคช(ต้องตรวจสอบความถูกต้องของสำเนาแคชใหม่ทุกครั้ง)

และคำขอตามเงื่อนไข:

  • คำขอตามเงื่อนไข Etag (แท็กเอนทิตี)
    • เซิร์ฟเวอร์: Etag: W/“1d2e7–1648e509289”
    • ลูกค้า: If-None-Match: W/“1d2e7–1648e509289”
    • เซิร์ฟเวอร์: 304 Not Modified
  • แก้ไขวันที่ตามเงื่อนไขการร้องขอ
    • เซิร์ฟเวอร์: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • ลูกค้า: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • เซิร์ฟเวอร์: 304 Not Modified

ปรับเปลี่ยนครั้งล่าสุด: พฤหัสบดี 9 พฤษภาคม 2019 19:15:47 GMT


2
RFC กล่าวว่าคุณควรใช้ทั้งคู่ในกรณีที่ไคลเอนต์ไม่รองรับการควบคุมแคช: tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
ลูกค้า "ควรจะ"รวมทั้ง - ถ้ามันต้องการที่จะรักษา HTTP / 1.1 และ HTTP / 1.0 แคชเซิร์ฟเวอร์ที่แตกต่างกัน เซิร์ฟเวอร์ไม่ควรรวมPragmaเลย (ใน HTTP / 1.0, Pragma ถูกกำหนดให้เป็นฟิลด์ที่ขยายได้สำหรับคำสั่งที่ระบุการนำไปปฏิบัติสำหรับผู้รับข้อมูลจำเพาะนี้เลิกใช้ส่วนขยายดังกล่าวเพื่อปรับปรุงการทำงานร่วมกัน)
Ian Boyd

2
จากมุมมองด้านความปลอดภัยขอแนะนำให้ใช้ เบราว์เซอร์จำนวนมากปฏิบัติตามคำสั่ง pragma: no-cache ดังนั้นจึงแนะนำให้ใช้ OWASP: owasp.org/index.php/…
Randall Borck

2
@ RandallBorck: คุณกำลังเผยแพร่ข้อมูลที่ล้าสมัย (สองทศวรรษไม่น้อยไปกว่านี้!) ไม่มี เบราว์เซอร์ใดที่ปฏิบัติตามคำสั่ง Pragma อีกต่อไปเว้นแต่ว่าจะเป็นปี 1999 นี่คือคำแนะนำลัทธิขนส่งสินค้า: "มันไม่เจ็บและเราได้ทำมาตลอดดังนั้นมันจึงเป็นสิ่งที่ดีและจำเป็น"
Piskvor ออกจากอาคาร

2
@Piskvor เซิร์ฟเวอร์ส่วนใหญ่ยังคงรองรับทั้ง 1.0 และ 1.1 ดังนั้นหากคุณไม่ปิดกั้นการร้องขอ HTTP / 1.0 คุณจะไม่เลือกโปรโตคอลที่ลูกค้าใช้ นักพัฒนาส่วนใหญ่ในวันนี้ไม่รำคาญที่จะปิดกั้น 1.0 ด้วยเหตุนี้มันก็ยังคงเป็นวิธีที่ดีที่สุดแม้ใน 2019
แรนดอ Borck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.