บทนำ
ชุดขั้นต่ำที่ถูกต้องของส่วนหัวที่ทำงานในไคลเอนต์ที่กล่าวถึงทั้งหมด (และพร็อกซี่):
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Cache-Control
เป็นต่อข้อมูลจำเพาะ HTTP 1.1 สำหรับลูกค้าและผู้รับมอบฉันทะ (และโดยปริยายจำเป็นโดยลูกค้าบางส่วนติดกับExpires
) Pragma
เป็นต่อข้อมูลจำเพาะสำหรับลูกค้ายุคก่อนประวัติศาสตร์ HTTP 1.0 Expires
เป็นต่อของ HTTP 1.0 และ 1.1 รายละเอียดสำหรับลูกค้าและผู้รับมอบฉันทะ ใน HTTP 1.1 Cache-Control
จะมีความสำคัญมากกว่าExpires
ดังนั้นสำหรับ HTTP 1.0 proxies เท่านั้น
หากคุณไม่สนใจเกี่ยวกับ IE6 และการแคชที่ใช้งานไม่ได้เมื่อให้บริการหน้าเว็บผ่าน HTTPS เพียงอย่างเดียวno-store
คุณก็สามารถละเว้นCache-Control: no-cache
ได้
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
หากคุณไม่สนใจเกี่ยวกับไคลเอนต์ IE6 หรือ HTTP 1.0 (HTTP 1.1 ถูกนำมาใช้ในปี 1997) คุณสามารถละเว้นPragma
ได้
Cache-Control: no-store, must-revalidate
Expires: 0
หากคุณไม่สนใจ HTTP พร็อกซี 1.0 เช่นกันคุณสามารถละเว้นExpires
ได้
Cache-Control: no-store, must-revalidate
ในทางกลับกันหากเซิร์ฟเวอร์รวมDate
ส่วนหัวที่ถูกต้องโดยอัตโนมัติคุณก็สามารถละเว้นCache-Control
ด้วยเหตุผลได้เช่นกันและพึ่งพาExpires
เท่านั้น
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
แต่นั่นอาจล้มเหลวหากเช่นผู้ใช้ปลายทางจัดการกับวันที่ของระบบปฏิบัติการและซอฟต์แวร์ไคลเอ็นต์นั้นใช้งานได้
Cache-Control
พารามิเตอร์อื่น ๆเช่นmax-age
ไม่เกี่ยวข้องหากCache-Control
ระบุพารามิเตอร์ข้างต้น Last-Modified
ส่วนหัวที่รวมไว้ในคำตอบอื่น ๆ ส่วนใหญ่ที่นี่เป็นเพียงที่น่าสนใจถ้าคุณต้องการจริงแคชคำขอเพื่อให้คุณไม่จำเป็นต้องระบุว่าที่ทุกคน
วิธีการตั้งค่า
ใช้ PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
ใช้ Java Servlet หรือ Node.js:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
ใช้ ASP.NET-MVC
Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
ใช้ ASP.NET Web API:
// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
NoCache = true,
NoStore = true,
MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString());
ใช้ ASP.NET:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
ใช้ ASP.NET Core v3
// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";
ใช้ ASP:
Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.
ใช้ Ruby on Rails หรือ Python / Flask:
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
ใช้ Python / Django:
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
ใช้ Python / พีระมิด:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
ใช้งาน:
responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.
ใช้.htaccess
ไฟล์Apache :
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
ใช้ HTML4:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
แท็ก HTML เมตากับส่วนหัวการตอบสนอง HTTP
สิ่งสำคัญที่รู้ก็คือว่าเมื่อเพจ HTML จะทำหน้าที่มากกว่าการเชื่อมต่อ HTTP และส่วนหัวมีอยู่ในทั้งส่วนหัวของการตอบสนอง HTTP และแบบ HTML <meta http-equiv>
แท็กแล้วหนึ่งที่ระบุไว้ในส่วนหัวของการตอบสนอง HTTP จะได้รับความสำคัญเหนือกว่าเมตาแท็กของ HTML เมตาแท็ก HTML จะใช้เฉพาะเมื่อดูหน้าเว็บจากระบบไฟล์ดิสก์ในระบบผ่านfile://
URL ดูที่ข้อกำหนดเฉพาะ W3 HTML บทที่ 5.2.25.2.2 ระวังสิ่งนี้เมื่อคุณไม่ได้ระบุโดยทางโปรแกรมเนื่องจากเว็บเซิร์ฟเวอร์สามารถรวมค่าเริ่มต้นบางอย่างได้
โดยทั่วไปคุณจะไม่ควรระบุเมตาแท็ก HTML เพื่อหลีกเลี่ยงความสับสนโดยการเริ่มและพึ่งพาส่วนหัวการตอบกลับ HTTP ที่ยาก ยิ่งไปกว่านั้นโดยเฉพาะ<meta http-equiv>
แท็กเหล่านั้นไม่ถูกต้องใน HTML5 อนุญาตเฉพาะhttp-equiv
ค่าที่ระบุไว้ในข้อมูลจำเพาะ HTML5เท่านั้น
การตรวจสอบส่วนหัวการตอบสนอง HTTP จริง
หากต้องการตรวจสอบอีกรายการหนึ่งคุณสามารถดู / ตรวจแก้จุดบกพร่องได้ใน HTTP Traffic Monitor ของชุดเครื่องมือผู้พัฒนาเว็บเบราเซอร์ คุณสามารถไปที่นั่นได้โดยกด F12 ใน Chrome / Firefox23 + / IE9 + จากนั้นเปิดแผงแท็บ "เครือข่าย" หรือ "สุทธิ" แล้วคลิกคำขอ HTTP ที่น่าสนใจเพื่อเปิดเผยรายละเอียดทั้งหมดเกี่ยวกับคำขอ HTTP และการตอบสนอง ด้านล่างหน้าจอเป็นจาก Chrome:
ฉันต้องการตั้งค่าส่วนหัวเหล่านั้นในการดาวน์โหลดไฟล์ด้วย
ก่อนอื่นคำถามและคำตอบนี้กำหนดเป้าหมายไว้ที่ "หน้าเว็บ" (หน้า HTML) ไม่ใช่ "ดาวน์โหลดไฟล์" (PDF, zip, Excel, ฯลฯ ) คุณควรให้พวกเขาแคชและใช้ประโยชน์จากตัวระบุเวอร์ชันของไฟล์บางแห่งในพา ธ URI หรือการสอบถามเพื่อบังคับให้ทำการดาวน์โหลดซ้ำในไฟล์ที่ถูกเปลี่ยน เมื่อใช้ส่วนหัวที่ไม่มีแคชเหล่านั้นในการดาวน์โหลดไฟล์ให้ระวังข้อผิดพลาด IE7 / 8 เมื่อให้บริการดาวน์โหลดไฟล์ผ่าน HTTPS แทน HTTP ดูรายละเอียดได้ที่IE ไม่สามารถดาวน์โหลด foo.jsf IE ไม่สามารถเปิดเว็บไซต์นี้ได้ ไซต์ที่ร้องขอไม่พร้อมใช้งานหรือไม่สามารถพบได้