วิธีการตั้งค่าส่วนหัว HTTP (สำหรับการควบคุมแคช)?


237

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Cache-Control:public;
>

ฉันกำลังใช้ PHP เวอร์ชันล่าสุดพัฒนาบน XAMPP เวอร์ชันล่าสุด


คุณใช้ภาษาฝั่งเซิร์ฟเวอร์ใด PHP, ASP, JSP วิธีที่คุณตั้งค่าส่วนหัวคล้ายกัน แต่ไม่เหมือนกัน หรือถ้าคุณกำลังแคชภาพ ... มักจะนี้จะทำใน Apache (หรือเว็บเซิร์ฟเวอร์ของคุณ) การตั้งค่า
scunliffe

น่าเศร้าที่ "โซลูชัน" เพียงสร้าง DOCTYPE ที่ไม่ถูกต้องหากคุณต้องการทำจาก HTML (ฉันไม่แนะนำ) คุณจะต้องใช้META HTTP-EQUIV

คำตอบ:


198

หากต้องการใช้การควบคุมแคชใน HTML ให้ใช้เมตาแท็กเช่น

<meta http-equiv="Cache-control" content="public">

ค่าในฟิลด์เนื้อหาถูกกำหนดเป็นหนึ่งในสี่ค่าด้านล่าง

ข้อมูลบางอย่างบนCache-Controlส่วนหัวมีดังนี้

HTTP 1.1 ค่าที่อนุญาต = PUBLIC | ความเป็นส่วนตัว | NO-CACHE | NO-STORE

สาธารณะ - อาจถูกแคชในแคชสาธารณะที่แชร์
ส่วนตัว - อาจถูกแคชในแคชส่วนตัวเท่านั้น
ไม่มีแคช - อาจไม่ถูกแคช
ไม่มีร้านค้า - อาจถูกแคช แต่ไม่ได้เก็บถาวร

คำสั่ง CACHE-CONTROL: NO-CACHE หมายถึงไม่ควรใช้ข้อมูลแคชและควรส่งต่อคำขอไปยังเซิร์ฟเวอร์ต้นทางแทน คำสั่งนี้มีความหมายเช่นเดียวกับ PRAGMA: NO-CACHE

ลูกค้าควรมีทั้ง PRAGMA: NO-CACHE และ CACHE-CONTROL: NO-CACHE เมื่อคำร้องขอ no-cache ถูกส่งไปยังเซิร์ฟเวอร์ที่ไม่รู้จักว่าสอดคล้องกับ HTTP / 1.1 ดูที่ EXPIRES

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


30
HTML5 ห้ามสิ่งนี้และ<meta>เป็นวิธีที่น่ากลัวและไม่สม่ำเสมอในการระบุการแคช
Kornel

1
@ porneL ฉันมีปัญหาในการทำความเข้าใจว่าส่วนใดของลิงก์ของคุณที่ห้ามคำตอบส่วนหนึ่ง ... รายละเอียดเมตาแท็กไม่ได้พูดถึงสิ่งที่ไม่ชอบเกี่ยวกับสิ่งที่เขียนที่นี่หรือห้ามใช้
Félix Gagnon-Grenier

1
@ FélixGagnon-Grenier "แอตทริบิวต์ http-equiv เป็นแอตทริบิวต์ที่ระบุ" หมายความว่าอนุญาตเฉพาะค่าในตารางในข้อมูลจำเพาะ มันยังเรียกการแคชในส่วนต่อมา ("คำสั่ง pragma อื่น ๆ "):> คำสั่ง Pragma ที่สอดคล้องกับส่วนหัวที่มีผลต่อรูปแบบการประมวลผล HTTP (เช่นการแคช) จะต้องไม่ลงทะเบียนเนื่องจากจะทำให้พฤติกรรม HTTP ระดับแตกต่างกันสำหรับ ตัวแทนผู้ใช้ที่ใช้ HTML มากกว่าสำหรับตัวแทนผู้ใช้ที่ไม่ได้
Kornel

3
เอกสารที่ยกมานั้นไม่ถูกต้องเกี่ยวกับno-storeค่า (แม้จะเป็นเอกสารอ้างอิงRFC 2068 ) - no-storeป้องกันไม่ให้เอกสารถูกเก็บ / แคชเลยทุกที่ทุกเวลา ในขณะที่no-cacheอนุญาตให้เก็บไว้ แต่ต้องตรวจสอบกับเซิร์ฟเวอร์ทุกครั้ง เบราว์เซอร์มักจะจัดเก็บno-cacheหน้าเว็บเพื่อเปิดใช้งานฟังก์ชั่นปุ่มย้อนกลับเป็นต้น
MrWhite

3
Google จัดให้มีหนึ่งในการอ้างอิงที่ง่ายที่สุดสำหรับการแคช HTTP IMO: developers.google.com/web/fundamentals/performance/…
MrWhite

137

คุณสามารถตั้งค่าส่วนหัวใน PHP ได้โดยใช้:

<?php
  //set headers to NOT cache a page
  header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
  header("Pragma: no-cache"); //HTTP 1.0
  header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

  //or, if you DO want a file to cache, use:
  header("Cache-Control: max-age=2592000"); //30days (60sec * 60min * 24hours * 30days)

?>

โปรดทราบว่าส่วนหัวที่แน่นอนที่ใช้จะขึ้นอยู่กับความต้องการของคุณ (และหากคุณต้องการสนับสนุนHTTP 1.0และ / หรือHTTP 1.1 )


3
PragmaและExpiresอาจซ้ำซ้อนสำหรับเบราว์เซอร์ส่วนใหญ่ fastly.com/blog/headers-we-dont-want
thijsai

1
@thijsai ใช่ HTTP / 1.0 เป็นจำนวนมากเช่นกัน ... ใช้เฉพาะส่วนหัวที่คุณต้องการตามเมทริกซ์ผู้ใช้ของคุณ
scunliffe

50

ขณะที่ผมเขียน.htaccessดีที่สุดคือใช้ไฟล์ อย่างไรก็ตามโปรดระวังเวลาที่คุณทิ้งเนื้อหาไว้ในแคช

ใช้:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

ที่ไหน: 604800 = 7 วัน

PS: สิ่งนี้สามารถใช้เพื่อรีเซ็ตส่วนหัวใด ๆ


30

หน้าเว็บที่http://www.askapache.com/htaccess/apache-speed-cache-control.htmlแนะนำให้ใช้สิ่งนี้:

เพิ่มส่วนหัวควบคุมแคช

สิ่งนี้จะไปในไฟล์ root .htaccess ของคุณ แต่ถ้าคุณมีการเข้าถึง httpd.conf นั่นจะดีกว่า

รหัสนี้ใช้คำสั่ง FilesMatch และคำสั่ง Header เพื่อเพิ่ม Cache-Control Headers ให้กับไฟล์บางไฟล์

# 480 weeks
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=290304000, public"
</FilesMatch>

3
คำสั่งนี้สำคัญหรือไม่? "max-age = 290304000, สาธารณะ" หรือ "public, max-age = 290304000" หรือทั้งสองอย่างถูกต้องเท่ากัน?
Satya Prakash

2
การสั่งซื้อไม่สำคัญว่าค่าจะไม่ขัดแย้งกัน (เช่นcacheและno-cache) max-ageและpublicไม่ขัดแย้งดังนั้นคำสั่งไม่สำคัญ
เบลส

1
โปรดทราบว่าเนื่องจากมันใช้คำสั่งคุณต้องเปิดใช้งานHeader mod_headers
Skippy le Grand Gourou

@Skippy le Grand Gourou ฉันจะเปิดใช้งาน mod_headers ได้อย่างไร
Sam

@SamuelStratford ฉันอ่านมันมีความแตกต่างในการกระจายอื่น ๆ แต่ภายใต้ Debian คุณสามารถใช้a2enmodหรือทำให้การเชื่อมโยงสัญลักษณ์จากไป/etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
Skippy le Grand Gourou

21

นี่คือสิ่งที่ดีที่สุดที่.htaccessฉันเคยใช้ในเว็บไซต์จริงของฉัน:

<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

##Tweaks##
Header set X-Frame-Options SAMEORIGIN

## EXPIRES CACHING ##
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType application/pdf "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType image/x-icon "access 1 year"
ExpiresDefault "access 1 month"
</IfModule>
## EXPIRES CACHING ##

<IfModule mod_headers.c>
    Header set Connection keep-alive
    <filesmatch "\.(ico|flv|gif|swf|eot|woff|otf|ttf|svg)$">
        Header set Cache-Control "max-age=2592000, public"
    </filesmatch>
    <filesmatch "\.(jpg|jpeg|png)$">
        Header set Cache-Control "max-age=1209600, public"
    </filesmatch>
    # css and js should use private for proxy caching https://developers.google.com/speed/docs/best-practices/caching#LeverageProxyCaching
    <filesmatch "\.(css)$">
        Header set Cache-Control "max-age=31536000, private"
    </filesmatch>
    <filesmatch "\.(js)$">
        Header set Cache-Control "max-age=1209600, private"
    </filesmatch>
    <filesMatch "\.(x?html?|php)$">
        Header set Cache-Control "max-age=600, private, must-revalidate"
      </filesMatch>
</IfModule>

3
ตัวอย่างที่สมบูรณ์แบบของไฟล์. htaccess เกือบจะสมบูรณ์ถ้ามีภาพเฉพาะ & วิธีเขียนเส้นทางไปยังภาพและจะวางไฟล์. htaccess ไว้อย่างไร (เช่นในภาพ dir หรือดัชนี dir)? .. .เช่น. '<IfModule mod_headers.c> <Files /img/myimage.jpg> ส่วนหัวต่อท้าย Cache-Control "max-age = 3600, ต้องตรวจสอบความถูกต้องใหม่" </Files> </IfModule>' ... มันจะใช้งานได้ไหม .. . หรือ ... หรือวางไปที่ img dir '<filesmatch "^ (ตัวอย่าง \ .jpg | sample \ .png) $"> ชุดส่วนหัวควบคุมแคช "อายุสูงสุด = 31536000 สาธารณะ" </filesmatch>' .. . เหมือนกันทั้งหมดกลยุทธ์ดูเหมือนว่ามีความเสี่ยง - อยู่ดีตัวอย่างเฉพาะจะดีถ้าแคลอรี่
มาร์โก-UandL

2
เพียงแค่ FYI: การบีบอัด gzip ในไฟล์ JS และ CSS สามารถช่วยในการทำลายการเข้ารหัส SSL ของคุณ หากคุณเชื่อมั่นในความปลอดภัยอย่าเปิด gzip
Eduard Void

1
นี่คือการแคชหน้าบัญชีเข้าสู่ระบบดังนั้นคุณจึงไม่สามารถออกจากระบบบัญชีของคุณ แม้แต่คนที่แย่ลงก็ไม่สามารถเข้าถึงหน้าบัญชีและเข้าสู่ระบบด้วยการเข้าสู่ระบบของผู้ใช้ล่าสุด ไม่แนะนำให้ใช้บนไซต์อีคอมเมิร์ซจากนั้นคุณควรลบ<filesMatch "\.(x?html?|php)$">เพื่อหลีกเลี่ยงการแคชหน้า HTML แบบคงที่ การจับคู่ไฟล์ที่เหลือก็โอเค
nicoX

1
<filesmatch "\.(eot|woff|otf|ttf|svg)$">คุณได้ทำซ้ำ
nicoX

2
คุณตั้งค่าcssและjsเป็นส่วนตัวหากคุณมีการแคชพร็อกซี ฉันไม่พบคำแนะนำในลิงก์ของคุณเกี่ยวกับเรื่องนั้น CDN ส่วนใหญ่แนะนำให้คุณแคชค่าเหล่านั้น
nicoX

14

สำหรับเซิร์ฟเวอร์ Apache คุณควรตรวจสอบmod_expiresเพื่อตั้งค่า Expires และ Cache-Control header

หรือคุณสามารถใช้ส่วนหัวคำสั่งเพื่อเพิ่มการควบคุมแคชด้วยตัวคุณเอง:

Header set Cache-Control "max-age=290304000, public"

5

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

ค่าที่อนุญาตคือ:

สาธารณะ - อาจถูกแคชในแคชสาธารณะที่ใช้ร่วมกัน
ส่วนตัว - อาจถูกแคชในแคชส่วนตัวเท่านั้น
ไม่มีแคช - ไม่สามารถแคช
ไม่ได้ไม่มีร้านค้า - อาจถูกแคช แต่ไม่ได้เก็บถาวร

โปรดใช้ความระมัดระวังเกี่ยวกับตัวพิมพ์เล็ก เพิ่มเมตาแท็กต่อไปนี้ในแหล่งที่มาของหน้าเว็บของคุณ ความแตกต่างของการสะกดที่ท้ายแท็กนั้นคือคุณใช้ "/> = xml หรือ"> = html

    <meta http-equiv="Cache-control" content="public">
    <meta http-equiv="Cache-control" content="private">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="Cache-control" content="no-store">

แหล่งที่มา -> MetaTags


การแก้ไข: ไม่ควรเก็บแคชไม่อนุญาตให้แคชแคช แต่ต้องตรวจสอบกับเซิร์ฟเวอร์ก่อนที่จะถูกจอง - ดูpalizine.plynt.com/issues/2008Jul/cache-control-attributes
DangerMouse

Cache-Control no-store - no-store คล้ายกับ no-cache ซึ่งการตอบสนองไม่สามารถแคชและนำกลับมาใช้ใหม่ได้อย่างไรก็ตามมีความแตกต่างที่สำคัญอย่างหนึ่ง ไม่มีร้านค้าต้องการทรัพยากรที่จะขอและดาวน์โหลดจากเซิร์ฟเวอร์ต้นทางในแต่ละครั้ง นี่คือคุณสมบัติที่สำคัญเมื่อจัดการกับข้อมูลส่วนตัว
MarcoZen

5

OWASP แนะนำต่อไปนี้

เมื่อใดก็ตามที่เป็นไปได้ให้แน่ใจว่าส่วนหัว HTTP ควบคุมแคชถูกตั้งค่าด้วยไม่มีแคชไม่มีร้านค้าต้องตรวจสอบความถูกต้องส่วนตัว และส่วนหัวของ pragma HTTP ถูกตั้งค่าไว้โดยไม่มีแคช

<IfModule mod_headers.c>
    Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    Header set Pragma "no-cache"
</IfModule>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.