ปิดการใช้งานการแคชหน้า ป้องกันการแคชหน้าโดยใช้ PHP ปิดใช้งานการแคชหน้า เบราว์เซอร์เท่านั้น

บางครั้งอาจจำเป็นต้องป้องกันไม่ให้เบราว์เซอร์แคชเพจ เนื่องจากข้อมูลในเพจนั้นได้รับการอัปเดตทุกครั้ง นี่อาจเป็นการสร้างข้อมูลตามตัวกรองที่เลือกหรือเนื้อหาอื่นที่สร้างขึ้นในรูปแบบใหม่ทุกครั้ง กล่าวโดยย่อคือมีหลายครั้งที่จำเป็นต้องป้องกันไม่ให้โปรแกรมร้ายกาจแคชเพจ วันนี้เราจะเรียนรู้วิธีการนำสิ่งนี้ไปใช้ ในรูปแบบที่แตกต่างกัน, กับ โดยใช้ PHPหรือ HTML หรือ .htaccess

ห้ามการแคชหน้าใน HTML

ซึ่งสามารถทำได้โดยใช้เมตาแท็ก ตอนนี้เราจะคิดออก ตัวเลือกที่แตกต่างกันการห้ามแคช

ห้ามแคชโดยเบราว์เซอร์และพร็อกซีเซิร์ฟเวอร์

ปิดใช้งานการแคชหน้า เบราว์เซอร์เท่านั้น

กำลังตั้งค่าแคชเป็น เวลาที่แน่นอนสำหรับเบราว์เซอร์

เมื่อใช้โค้ดด้านล่าง เราสามารถบอกเบราว์เซอร์ได้ว่าต้องเก็บเอกสารไว้ในแคชนานแค่ไหน หลังจากนั้นแคชจะถูกอัพเดต

การตั้งค่าแคชตามเวลาที่กำหนดสำหรับพร็อกซีเซิร์ฟเวอร์

ในทางปฏิบัติ เช่นเดียวกับในโค้ดก่อนหน้า มีเพียงข้อบ่งชี้เฉพาะสำหรับพร็อกซีเซิร์ฟเวอร์

ป้องกันการแคชหน้าโดยใช้ PHP

ในทางปฏิบัติแล้ว ทุกอย่างจะเหมือนกับในกรณีของ HTML มีเพียงเราเท่านั้นที่จะแสดงข้อมูลผ่านส่วนหัวของส่วนหัว ต่อไปนี้คือวิธีการใช้การปฏิเสธแคชแบบสัมบูรณ์:

คุณยังสามารถอนุญาตการแคชในช่วงเวลาหนึ่งได้ ตัวอย่างเช่น อนุญาตให้แคชเพียง 1 ชั่วโมงเท่านั้น

ป้องกันการแคชหน้าโดยใช้ .htaccess

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

LoadModule หมดอายุ_โมดูลโมดูล/mod_expires.so LoadModule headers_module โมดูล/mod_headers.so ... AddModule mod_expires.c AddModule mod_headers.c

ขณะนี้ในไฟล์ .htaccess เราห้ามการแคชข้อมูลที่ส่งออกจริงๆ อย่างที่เราทราบกันดีว่า. ไฟล์ htaccessจะนำไปใช้กับไดเร็กทอรีที่มันตั้งอยู่และกับไดเร็กทอรีย่อยทั้งหมด

# Header Cache-Control Header ผนวก Cache-Control "no-store, no-cache, must-revalidate" # Header Expires ExpiresActive On ExpiresDefault "now"

สิ่งสำคัญคือต้องทราบว่า ห้ามโดยสมบูรณ์การแคชจะเพิ่มภาระบนเซิร์ฟเวอร์ ดังนั้นควรเล่นอย่างระมัดระวัง! ยังดีกว่า ให้ตั้งเวลาเฉพาะที่คุณสามารถแคชเอกสารได้ ตัวอย่างเช่น ตั้งค่าแคชเป็นเวลา 1 ชั่วโมง:

# Header Cache-Control Header ผนวก Cache-Control "สาธารณะ" # Header Expires ExpiresActive On ExpiresDefault "access plus 1 hours"

บทสรุปเล็กน้อยเกี่ยวกับแคช

เว็บมาสเตอร์มักพบกับแคช: เบราว์เซอร์และพร็อกซีเซิร์ฟเวอร์ที่พยายามเพิ่มความเร็วเว็บให้กับผู้ใช้พยายามเก็บไว้ให้มากที่สุด จำนวนมากเอกสารในแคช หากคุณเปิดหน้าไซต์ในเบราว์เซอร์จากนั้นเปิดหน้าอื่นแล้วกลับไปที่หน้าแรกโดยมีโอกาสสูงที่เบราว์เซอร์จะนำหน้านั้นมาจากดิสก์ของคุณ (หรือแม้แต่จาก แรม) ซึ่งเขาบันทึกหน้านี้ในการเข้าชมครั้งแรก เห็นได้ชัดว่าการดำเนินการนี้มักจะเร็วกว่าการดึงเอกสารเดียวกันจากเครือข่ายมาก ท้ายที่สุดแล้ว ในการแสดงหน้าเว็บ คุณไม่เพียงต้องได้รับโค้ด HTML เท่านั้น แต่ยังต้องดาวน์โหลดเอกสารประกอบทั้งหมดจากเครือข่ายด้วย: ไฟล์ CSS รูปภาพ สคริปต์ที่จัดรูปแบบเป็น แยกไฟล์ฯลฯ หากคุณดูในโฟลเดอร์แคชบนไดรฟ์ของคุณ (สำหรับ IE โฟลเดอร์นี้มักจะอยู่ที่นี่: "C:\Documents and Settings\ ชื่อผู้ใช้\Local Settings\Temporary Internet Files" สำหรับ Firefox: "C:\Documents and Settings\ ชื่อผู้ใช้\การตั้งค่าท้องถิ่น\ข้อมูลแอปพลิเคชัน\Mozilla\Firefox\โปรไฟล์\ _สุ่ม_สตริง_ default\Cache") จากนั้นคุณจะสังเกตได้ว่าเบราว์เซอร์ของคุณบันทึกไฟล์ไว้กี่ไฟล์

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

ปัญหาการแคชใน ไมโครซอฟต์อินเทอร์เน็ตนักสำรวจ

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

req.open("GET", "xmlprovider.php?hash=" + Math.random());

หรือตั้งค่าส่วนหัว Expires ให้เป็นวันที่ที่ผ่านมาในสคริปต์ของคุณที่สร้างเนื้อหา XML ใน PHP มันจะเป็นดังนี้:

// ปิดการใช้งานส่วนหัวแคชของ IE ("หมดอายุ: จันทร์ 26 กรกฎาคม 1997 05:00:00 GMT"); header("แก้ไขล่าสุด: " . gmdate("D, d M Y H:i:s") . " GMT"); header("การควบคุมแคช: ไม่มีแคช, ต้องตรวจสอบใหม่"); header("Pragma: ไม่มีแคช"); -

รหัส PHP คุ้นเคย? ฉันแน่ใจว่าคุณเขียนมัน (โดยปกติจะใช้วิธี สำเนา-แปะ) ในการทำงานของเขา แต่! มี "แต่" ที่สำคัญมากที่นี่: โดยไม่ลดความสำคัญและอำนาจของ Wikipedia แต่อย่างใด เราจะสังเกตเฉพาะข้อเท็จจริงที่น่าเสียดายว่ารหัสนี้ผิด! ต้องการแน่ใจหรือไม่? อย่างง่ายดาย!

กำลังตรวจสอบแคช

ดังนั้น เรามาเริ่ม Apache ด้วยการตั้งค่ามาตรฐานและค่าเริ่มต้นกันดีกว่า ที่นี่และต่อไปเราใช้ Apache และ PHP แต่นี่ไม่ได้หมายความว่าปัญหาที่อธิบายไว้และวิธีแก้ปัญหานั้นไม่พร้อมใช้งานบนแพลตฟอร์มของเซิร์ฟเวอร์อื่นเช่น Microsoft IIS เอาล่ะ มาเริ่ม Apache กันเลย สร้างโฟลเดอร์แคชทดสอบว่างในรูทเซิร์ฟเวอร์ และวางไฟล์ test-1.php ที่นั่นโดยมีเนื้อหาดังต่อไปนี้:

มันง่ายที่จะเห็นว่าในตัวอย่างข้างต้นเรา เรากำลังพยายามอยู่ปิดการใช้งานแคชตามสูตรของ Wikipedia และเพียงแสดงเวลาปัจจุบัน

ตอนนี้ลองดูโฟลเดอร์ของคุณในเบราว์เซอร์ ในการดำเนินการนี้ ให้เปิดเบราว์เซอร์แล้วพิมพ์ลงในแถบที่อยู่

ยอดเยี่ยม! ตอนนี้คลิกที่ไฟล์ test-1.php ของคุณแล้วจดเวลา (เช่น ฉันวางหน้าต่างเบราว์เซอร์ไว้ข้างนาฬิกา Windows):

เลิศ! ตอนนี้กดปุ่ม "ย้อนกลับ" และ "ส่งต่อ" ในเบราว์เซอร์:

อ๊ะ! เวลาไม่เปลี่ยน!!! สิ่งนี้หมายความว่าอย่างไร? ใช่เพียงเบราว์เซอร์เท่านั้นที่ดึงหน้าจากแคช!!! แล้วของเราล่ะ สารานุกรมรหัส? ใช่ มันใช้งานไม่ได้!

กลับไปที่แหล่งดั้งเดิมกันเถอะ

มีปัญหาอะไร? ปัญหาคือ การใช้ในทางที่ผิดส่วนหัวของการตอบกลับ ข้อมูลจำเพาะ RFC2616 อุทิศทั้งบทให้กับการแคช แต่น่าเสียดายที่เว็บมาสเตอร์มักไม่อ่านข้อกำหนด แล้วส่วนหัวที่เราเพิ่งผ่านไปนั้นหมายความว่าอย่างไร? มาดูพวกเขากันดีกว่า สะดวกมากในการใช้โปรแกรมเสริมแถบเครื่องมือ Firefox Web Developer: ข้อมูล. ดูการตอบสนองส่วนหัว(สำหรับ IE เครื่องมือที่คล้ายกันเรียกว่า DevToolbar):

ดังนั้นเราจึงผ่านส่วนหัวต่อไปนี้:

หมดอายุ: วันจันทร์ที่ 26 กรกฎาคม 1997 05:00:00 GMT - ส่วนหัวนี้กำหนดเวลาของความเกี่ยวข้องของข้อมูล เรากำลังพยายามผ่านวันที่ในอดีตโดยเชื่อว่าจะบังคับให้เบราว์เซอร์โหลดหน้าเว็บจากเซิร์ฟเวอร์ทุกครั้ง มันไม่ได้บังคับคุณอย่างที่เราเห็นจากประสบการณ์อย่างชัดเจน

แก้ไขล่าสุด: วันเสาร์ที่ 26 มกราคม 2551 เวลา 17:03:02 น. GMT — วันที่และเวลาที่ข้อมูลในเพจได้รับการแก้ไข ส่วนหัวนี้ไม่ส่งผลต่อการแคชเลย (อ่านใน RFC2616!) ยกเว้นว่าสามารถใช้สำหรับการร้องขอที่มีเครื่องมือตรวจสอบความถูกต้องได้ ตัวอย่างเช่น, หุ่นยนต์ค้นหาสามารถขอข้อมูลเช่นนี้: GET /megapage.html HTTP/1.1 If-Mofidied-Since: Sat, 26 Jan 2008 17:03:02 GMT

นั่นก็คือ " ให้เอกสารแก่ฉันหากมีการเปลี่ยนแปลงตั้งแต่วันที่ระบุ" และเซิร์ฟเวอร์ควรตอบกลับด้วย 200 ("นี่คือเอกสาร มันมีการเปลี่ยนแปลง!" หรือ 304 "ไม่มีการเปลี่ยนแปลง" แต่เพื่อให้ใช้งานได้ เซิร์ฟเวอร์ของคุณต้องส่งส่วนหัว Last-Modified และ ไม่ใช่แค่ส่งแต่ส่งวันที่ถูกต้องเอกสารก็แก้ไขแต่เราเองด้วยมือเราเองงี่เง่า สารานุกรมรหัสถูกทำลายอย่างสมบูรณ์ ความหวังสุดท้ายเกี่ยวกับเรื่องนี้! นั่นคือไม่เพียงแต่เราไม่ได้แบนแคชเท่านั้น แต่เรายังทำลายเครื่องมือค้นหาอย่างจริงจังด้วย (หรือมากกว่านั้นคือตัวเราเอง)! ท้ายที่สุดแล้ว คุณจึงผ่านวันที่ CURRENT เป็นวันที่ การเปลี่ยนแปลงครั้งล่าสุด, จดจำ?

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

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

ปิดการใช้งานแคช

บันทึกไฟล์ test-1.php อีกครั้งด้วยชื่อใหม่ test-2.php และเปลี่ยนแปลงดังนี้:

ตอนนี้ลองเปิดโฟลเดอร์ทดสอบของเราอีกครั้ง http://localhost/ทดสอบแคช/คลิกที่ชื่อ test-2.php แล้วคลิกที่ปุ่ม "ย้อนกลับ" และ "ไปข้างหน้า" เวลาเปลี่ยนทุกครั้ง! และนั่นหมายความว่าเบราว์เซอร์จะไม่นำเพจออกจากแคชเมื่อก้าวไปข้างหน้า/ข้างหลัง แต่จะร้องขอจากเซิร์ฟเวอร์อีกครั้ง ซึ่งอันที่จริงแล้วคือสิ่งที่เราต้องการ ลองดูที่ส่วนหัวของการตอบกลับ:

นี่ไง! เราผ่านสองส่วนหัว:

Cache -Control : no -store - หน้านี้มีข้อมูลส่วนตัว ไม่สามารถเก็บไว้ในแคชได้! (วัตถุประสงค์ของคำสั่ง no-store คือการป้องกันการปล่อยหรือการเก็บรักษาข้อมูลที่ละเอียดอ่อนโดยไม่ได้ตั้งใจ (เช่น บนเทปสำรองข้อมูล))

หมดอายุ: วันเสาร์ที่ 26 มกราคม 2551 เวลา 20:31:55 น. +0300 - ความเกี่ยวข้องของหน้าจะหมดอายุทันที นั่นคือ ขณะนี้

และเป็นส่วนหัวเหล่านี้ที่ป้องกันการแคชในเบราว์เซอร์ แต่ก็ยังถูกต้องกว่าในการเพิ่มคำแนะนำสำหรับพร็อกซีเซิร์ฟเวอร์ลงในส่วนหัว Cache-Control (ไฟล์ test-3.php):

ข้อห้ามในทางปฏิบัติของการแคช

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

LoadModule หมดอายุ_โมดูลโมดูล/mod_expires.so LoadModule headers_module โมดูล/mod_headers.so ... AddModule mod_expires.c AddModule mod_headers.c

ยอดเยี่ยม! ตอนนี้เพียงสร้างไฟล์. htaccess ในโฟลเดอร์ของคุณและเขียนสิ่งต่อไปนี้:

# # ปิดใช้งานการแคชในโฟลเดอร์นี้ # ต้องเปิดใช้งานโมดูล # mod_headers.c และ mod_expires.c # # ส่วนหัว การควบคุมแคช ส่วนหัวต่อท้าย การควบคุมแคช "no-store, no-cache, must-revalidate" # ส่วนหัวหมดอายุ ExpiresActive On ExpiresDefault " ตอนนี้"

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

สิทธิ์ในการแคช

แต่แม้ว่าผู้ดูแลเว็บจำนวนมากจะถือว่าแคชเป็นสิ่งชั่วร้ายสากลและ กำลังพยายามห้าม (และอย่างที่เราได้เห็นแล้วว่าค่อนข้างไม่ประสบความสำเร็จ) นี่ไม่เป็นเช่นนั้น! ด้วยการปิดใช้งานแคช คุณจะบังคับให้เบราว์เซอร์โหลดหน้าเว็บของคุณจากเซิร์ฟเวอร์ในแต่ละครั้ง และหากช่องทางการสื่อสารของผู้ใช้อ่อนแอ สิ่งนี้อาจทำให้การใช้งานไซต์ของคุณช้าลงอย่างเห็นได้ชัด ไม่ต้องพูดถึงความจริงที่ว่าสิ่งนี้นำไปสู่การเพิ่มภาระบนเซิร์ฟเวอร์ของคุณ! หากเพจหรือส่วนหนึ่งของเพจของคุณถูกสร้างขึ้นโดยการสืบค้นในฐานข้อมูล คุณจะเพิ่มภาระงานบนเซิร์ฟเวอร์ฐานข้อมูลด้วย ซึ่งอาจส่งผลเสียอย่างมากต่อประสิทธิภาพของเซิร์ฟเวอร์โดยรวม คุณรู้ว่าฉันกำลังพูดถึงอะไร เช่น ดูที่งาน www.odnoklassniki.ru- เว็บมาสเตอร์บางคนยังอวดด้วยการแสดง "สถิติ" เหล่านี้ที่ด้านล่างของหน้า: " เพจสร้างขึ้นใน 0.9 วินาที, 9 เสร็จสมบูรณ์SQLคำขอ- นี่ไม่ได้แสดงอะไรเลยนอกจากสถาปัตยกรรมเว็บแอปพลิเคชันที่โง่เขลาอย่างแน่นอน!

ในทางกลับกัน เรามาลองยกเลิกการโหลดเซิร์ฟเวอร์และเร่งการทำงานของผู้ใช้ของเรากันดีกว่า! และแคชในเรื่องนี้ก็เป็นหนึ่งในนั้น เครื่องมืออันทรงพลัง- กรุณาบอกฉันหน่อยว่าหน้า “เกี่ยวกับบริษัท” ของคุณมีการเปลี่ยนแปลงบ่อยแค่ไหน? หรือจะเกิดอะไรขึ้นหากผู้ใช้เห็นข่าวสารของคุณ (“ ไชโย! เราย้ายไปที่ เครื่องยนต์ใหม่ "") อีกหนึ่งชั่วโมงต่อมา? เหตุใดจึงห้ามการแคชหน้าดังกล่าว?

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

หรือคุณสามารถทำโดยไม่ต้องใช้ PHP เลย สร้างไฟล์ .htaccess ในโฟลเดอร์และป้อนข้อมูลต่อไปนี้:

# # อนุญาตให้แคชในโฟลเดอร์นี้ # ต้องเปิดใช้งานโมดูล # mod_headers.c และ mod_expires.c # # ส่วนหัวการควบคุมแคชผนวกการควบคุมแคช "สาธารณะ" # ส่วนหัวหมดอายุ ExpiresActive On ExpiresDefault "เข้าถึงบวก 1 ชั่วโมง"

อย่างที่พวกเขาพูดกันว่าผลลัพธ์นั้นมองเห็นได้ด้วยตาเปล่า วิธีนี้มีประสิทธิภาพโดยเฉพาะอย่างยิ่งสำหรับกราฟิกไซต์ สำหรับเพจที่มีเนื้อหาที่ไม่ค่อยมีการเปลี่ยนแปลง หรือสำหรับเพจที่เข้าชมบ่อย เช่น หน้าแรก

ขอคำแนะนำ: ก่อนอื่นให้ทำการดีบั๊กเว็บไซต์ของคุณให้สมบูรณ์ จากนั้นจึงเปิดใช้งานการแคช! มิฉะนั้น คุณอาจเสี่ยงที่จะกลายเป็นสีเทาในขณะที่มองหาข้อผิดพลาด และไม่แยแสกับเทคโนโลยีเว็บโดยสิ้นเชิง :)
ขอให้โชคดีและโชคดีกับการแคช!

จะปิดการใช้งานแคชได้อย่างไร?

คำตอบของอาจารย์:

การแคชเอกสารไม่ได้มีประโยชน์เสมอไปในแง่ของ ทำงานเร็วเบราว์เซอร์ หากต้องการปิดใช้งาน คุณจำเป็นต้องทราบคุณลักษณะที่มีอยู่ในอินเทอร์เน็ตเบราว์เซอร์แต่ละตัว จะปิดการใช้งานแคชในอินเทอร์เน็ตเบราว์เซอร์ยอดนิยมได้อย่างไร?

ลองทำสิ่งต่อไปนี้หากใช้ มอซซิลา ไฟร์ฟอกซ์- ใน แถบที่อยู่เบราว์เซอร์เข้าสู่ opera:config หน้าต่างจะปรากฏขึ้นเพื่อเตือนให้คุณระวังอย่างยิ่ง คลิก "ตกลง" ค้นหา “ตัวกรอง” และพิมพ์ browser.cache ที่นั่น หลังจากนี้การตั้งค่าจะเหลือไม่เกินสิบบรรทัด

หากต้องการปิดใช้งานการแคช ให้ค้นหา browser.cache.disk.enable และ browser.cache.memory.enable มาเน้นที่ฟิลด์ค่ากันดีกว่า มีทั้งสองบรรทัดนี้ จริง- ลองเปลี่ยนเป็นเท็จ หลังจากนี้ ให้รีสตาร์ทเบราว์เซอร์เพื่อให้การเปลี่ยนแปลงทั้งหมดมีผล 2. ลองทำสิ่งต่อไปนี้หากใช้ Internet Explorer ในเมนูให้เปิด "เครื่องมือ" จากนั้นคลิกที่หน้าต่าง "ตัวเลือกอินเทอร์เน็ต" หน้าต่างคุณสมบัติเบราว์เซอร์จะเปิดขึ้น ไปที่แท็บ "ทั่วไป" คลิก "ตัวเลือก"

จากนั้นในตัวเลือก "ตรวจสอบการอัปเดตหน้าที่บันทึกไว้" ให้เลือก "ไม่" หากต้องการปิดใช้งานแคช ให้ใส่ศูนย์ถัดจากหน้าต่าง "พื้นที่ดิสก์ที่ใช้" หลังจากนั้นคลิก "ตกลง" เพื่อยอมรับการเปลี่ยนแปลง

หากคุณใช้โอเปร่า กดปุ่ม Ctrl+F12 จากนั้นเลือก “ การตั้งค่าทั่วไป- ไปที่แท็บ "ขั้นสูง" จากนั้นไปที่ "เรื่องราว" แท็บ "แคชหน่วยความจำ" รวมถึง " ดิสก์แคช» ตั้งค่าเป็น “ปิดใช้งาน” เพื่อปิดใช้งานการแคช ในหน้าต่าง "ตรวจสอบเอกสาร" และ "ตรวจสอบรูปภาพ" ให้เลือก "ไม่" จากนั้น "ตกลง" การเปลี่ยนแปลงจะมีผล

ถ้าใช้ กูเกิลโครม- คลิกกันได้เลย คลิกขวาเมาส์ไปที่ทางลัดการเปิดเบราว์เซอร์ หลังจากการปรากฏตัว เมนูบริบทเลือกหน้าต่าง "คุณสมบัติ" หลังจากนั้นในหน้าต่างที่ปรากฏขึ้นให้ไปที่แท็บ "ทางลัด" ในหน้าต่างที่ระบุที่อยู่ไฟล์ ให้เพิ่ม “-disk-cache-size=0-media-cache-size=0” มาวางกันเถอะ คำสั่งนี้ด้านหลังเครื่องหมายคำพูดที่อยู่ไฟล์ ลองใช้การเปลี่ยนแปลง

เบราว์เซอร์สมัยใหม่มักใช้แคชในเครื่องในการทำงาน สิ่งนี้หมายความว่าอย่างไร? ซึ่งหมายความว่าเบราว์เซอร์ที่ได้รับเอกสาร HTML รูปภาพหรือทรัพยากรอื่น ๆ จากเซิร์ฟเวอร์จะวางไว้ในแคชในเครื่อง (กล่าวอีกนัยหนึ่งคือเขียนทรัพยากรที่ได้รับไปที่ ฮาร์ดไดรฟ์เครื่องผู้ใช้) และในระหว่างการร้องขอในภายหลังไปยังทรัพยากรดังกล่าวจะไม่เข้าถึงเซิร์ฟเวอร์ แต่ได้รับทรัพยากรจากแคชในเครื่อง

อัลกอริธึมของเบราว์เซอร์นี้เพิ่มความเร็วในการโหลดเอกสาร HTML อย่างมาก เนื่องจากหากโหลดทรัพยากรแล้วและด้วยเหตุนี้จึงอยู่ในแคชในเครื่องจึงไม่ได้กำหนดเวลาการเข้าถึง ปริมาณงานช่องทางการสื่อสาร (เช่น การเชื่อมต่อโมเด็ม) และความเร็ว ทำงานหนักดิสก์.

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

หากต้องการบังคับให้เบราว์เซอร์ขอเพจจากเซิร์ฟเวอร์ทุกครั้ง คุณต้องห้ามไม่ให้เบราว์เซอร์เข้ามา ทรัพยากรนี้เพื่อแคช ด้านล่างนี้เป็นวิธีการทั่วไปในการปิดใช้งานหรือข้ามการแคช

กำลังสร้าง URL ใหม่

สมมติว่าทรัพยากรที่ร้องขอมี URL ต่อไปนี้: test.html?id=7 อย่างที่คุณเห็นจาก url "และส่งพารามิเตอร์หนึ่งตัวไป ลองเพิ่มด้วย ช่วยเหลือจาวาสคริปต์มีพารามิเตอร์อีกหนึ่งตัวใน url และเราจะทำให้มันมีค่าของมัน หมายเลขสุ่ม- ด้วยเหตุนี้ URL จะมีลักษณะดังนี้: test.html?id=7&rnd=0.6700820127538827 พารามิเตอร์สุ่มจะถูกสร้างขึ้นใหม่ทุกครั้ง ด้านล่างนี้เป็นรายการที่แสดงให้เห็นถึงแนวทางนี้:

การสร้าง URL ใหม่ document.write("");

ลิงค์ทดสอบ

แต่ละครั้งผลลัพธ์ของคำขอดังกล่าวจะถูกแคช แต่เนื่องจากการแคชดำเนินการกับ URL ทั้งหมด จึงจะได้รับ URL ใหม่ทุกครั้งและเบราว์เซอร์จะถูกบังคับให้ขอทรัพยากรจากเซิร์ฟเวอร์ เนื่องจาก URL ของ คำขอสองรายการจะไม่ตรงกันทุกประการ

ฟิลด์ส่วนหัว คุณยังสามารถจัดการแคชได้จากฝั่งเซิร์ฟเวอร์ เพื่อให้บรรลุเป้าหมายนี้ ทรัพยากรที่ส่งไปยังเบราว์เซอร์จะมีฟิลด์ส่วนหัวมาด้วยคำอธิบายโดยละเอียด ฟิลด์ส่วนหัวสามารถพบได้ในมาตรฐาน Rfc 2068 ซึ่งอธิบายไว้ 1.1.

โปรโตคอล HTTP

ฟิลด์ส่วนหัวหมดอายุ

ค่าของส่วนหัวนี้คือวันที่หลังจากที่เนื้อหาของทรัพยากรล้าสมัย หากผู้ใช้เข้าถึงทรัพยากรหลังจากวันที่นี้ เบราว์เซอร์จะต้องร้องขอทรัพยากรจากเซิร์ฟเวอร์มากกว่าจากแคชในเครื่อง< содержит дату, прошедшую, по отношению к текущей, то при следующем обращении к ресурсу браузер будет вынужден снова обратиться к серверу. Это произойдет вследствие того, что либо документ не будет занесен в кэш - как уже устаревший, либо при обращении к кэшу браузер определит, что документ уже устарел. Следующий листинг на PHP демонстрирует использование заголовка Expires:

หากฟิลด์ >หมดอายุ

ฟิลด์ส่วนหัวที่แก้ไขล่าสุด ค่าของส่วนหัวนี้คือวันที่อัปเดตล่าสุด ทรัพยากร. ส่วนใหญ่ใช้ อัลกอริธึมถัดไปหากทรัพยากรอยู่ในแคชในเครื่องแล้ว:

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

หากทรัพยากรที่อยู่บนเซิร์ฟเวอร์มีอยู่ในฟิลด์นี้ วันที่ปัจจุบันจากนั้นเบราว์เซอร์จะขอทรัพยากรจากเซิร์ฟเวอร์ในแต่ละครั้ง ไม่ใช่จากแคชในเครื่อง รายการต่อไปนี้สาธิตการใช้ฟิลด์ส่วนหัวที่แก้ไขล่าสุด:

Header("แก้ไขล่าสุด: " . gmdate("D, d M Y H:i:s") . " GMT");

ฟิลด์ส่วนหัว Cache-Control และ Pragma

และสุดท้ายคือฟิลด์ส่วนหัวซึ่งรับผิดชอบโดยตรงในการแคชทรัพยากร ฟิลด์นี้ถูกกำหนดไว้ในมาตรฐาน RFC 1945 ที่อธิบายโปรโตคอล HTTP 1.0 ฟิลด์นี้ถือว่าล้าสมัย แต่ในบางกรณีก็จำเป็นต้องใช้ โดยเฉพาะอย่างยิ่ง พร็อกซีเซิร์ฟเวอร์บางตัวไม่ประมวลผลคำขอสำหรับการเปลี่ยนแปลงทรัพยากรอย่างต่อเนื่องอย่างถูกต้อง หากไม่ได้ส่งฟิลด์ส่วนหัวนี้ไปพร้อมกับทรัพยากร

ฟิลด์ที่สองถูกกำหนดไว้ในมาตรฐาน RFC 2068 ซึ่งอธิบายโปรโตคอล HTTP 1.1 ฟิลด์ส่วนหัวนี้ช่วยให้คุณสามารถปิดใช้งานการแคชและร้องขอทรัพยากรจากเซิร์ฟเวอร์ในแต่ละครั้ง รายการต่อไปนี้สาธิตการใช้ฟิลด์ส่วนหัว Cache-Control และ Pragma เพื่อปิดใช้งานการแคช:

ส่วนหัว ("การควบคุมแคช: ไม่มีแคช, ต้องตรวจสอบใหม่"); header("Pragma: ไม่มีแคช");

เว็บมาสเตอร์มักพบกับแคช: เบราว์เซอร์และพร็อกซีเซิร์ฟเวอร์พยายามเพิ่มความเร็วเว็บให้กับผู้ใช้พยายามจัดเก็บเอกสารให้ได้มากที่สุดในแคช

บางครั้งจำเป็นต้องป้องกันไม่ให้เบราว์เซอร์แคชเพจเนื่องจากข้อมูลในนั้นจะได้รับการอัปเดตทุกครั้ง นี่อาจเป็นการสร้างข้อมูลตามตัวกรองที่เลือกหรือเนื้อหาอื่นที่สร้างขึ้นในรูปแบบใหม่ทุกครั้ง กล่าวโดยย่อคือมีหลายครั้งที่จำเป็นต้องป้องกันไม่ให้โปรแกรมร้ายกาจแคชเพจ วันนี้เราจะได้เรียนรู้วิธีการใช้งานในรูปแบบต่างๆ โดยใช้ PHP หรือ HTML หรือ .htaccess

ห้ามการแคชหน้าใน HTML

ซึ่งสามารถทำได้โดยใช้เมตาแท็ก
ห้ามแคชโดยเบราว์เซอร์และพร็อกซีเซิร์ฟเวอร์

ปิดใช้งานการแคชหน้า เบราว์เซอร์เท่านั้น

การตั้งค่าแคชตามเวลาที่กำหนดสำหรับเบราว์เซอร์

เมื่อใช้โค้ดด้านล่าง เราสามารถบอกเบราว์เซอร์ได้ว่าต้องเก็บเอกสารไว้ในแคชนานแค่ไหน หลังจากนั้นแคชจะถูกอัพเดต

การตั้งค่าแคชตามเวลาที่กำหนดสำหรับพร็อกซีเซิร์ฟเวอร์
ในทางปฏิบัติ เช่นเดียวกับในโค้ดก่อนหน้า มีเพียงข้อบ่งชี้เฉพาะสำหรับพร็อกซีเซิร์ฟเวอร์

ป้องกันการแคชหน้าโดยใช้ PHP

ในทางปฏิบัติแล้ว ทุกอย่างจะเหมือนกับในกรณีของ HTML มีเพียงเราเท่านั้นที่จะแสดงข้อมูลผ่านส่วนหัวของส่วนหัว ต่อไปนี้คือวิธีการใช้การปฏิเสธแคชแบบสัมบูรณ์:

คุณยังสามารถอนุญาตการแคชในช่วงเวลาหนึ่งได้ ตัวอย่างเช่น อนุญาตให้แคชเพียง 1 ชั่วโมงเท่านั้น

ป้องกันการแคชหน้าโดยใช้ .htaccess

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

LoadModule หมดอายุ_โมดูลโมดูล/mod_expires.so
LoadModule headers_module โมดูล/mod_headers.so
...
เพิ่มโมดูล mod_expires.c
เพิ่มโมดูล mod_headers.c

ขณะนี้ในไฟล์ .htaccess เราห้ามการแคชข้อมูลที่ส่งออกจริงๆ ดังที่เราทราบ ไฟล์ .htaccess จะถูกแจกจ่ายไปยังไดเร็กทอรีที่ไฟล์นั้นตั้งอยู่และไปยังไดเร็กทอรีย่อยทั้งหมด

# Header Cache-Control Header ผนวก Cache-Control "no-store, no-cache, must-revalidate" # Header Expires ExpiresActive On ExpiresDefault "now"

สิ่งสำคัญคือต้องทราบว่าการห้ามแคชโดยสิ้นเชิงจะเพิ่มภาระบนเซิร์ฟเวอร์ ดังนั้นควรเล่นอย่างระมัดระวัง! ยังดีกว่า ให้ตั้งเวลาเฉพาะที่คุณสามารถแคชเอกสารได้ ตัวอย่างเช่น ตั้งค่าแคชเป็นเวลา 1 ชั่วโมง:

# Header Cache-Control Header ผนวก Cache-Control "สาธารณะ" # Header Expires ExpiresActive On ExpiresDefault "access plus 1 hours"