IIS7 Cache-Control


98

ฉันกำลังพยายามทำบางสิ่งที่ฉันคิดว่ามันค่อนข้างง่าย รับ IIS 7 เพื่อบอกลูกค้าว่าสามารถแคชรูปภาพทั้งหมดบนไซต์ของฉันได้ในช่วงเวลาหนึ่งสมมติว่า 24 ชั่วโมง

ฉันได้ลองทำตามขั้นตอนบนhttp://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx แล้วแต่ก็ไม่มีประโยชน์ ฉันยังคงได้รับคำขอไปยังเซิร์ฟเวอร์โดยมีการส่งคืน 304

ใครมีวิธีการทำเช่นนี้? ฉันมีไซต์ที่เน้นกราฟิกมากและผู้ใช้ของฉันถูกตอก (เช่นเดียวกับเซิร์ฟเวอร์ของฉัน) ทุกครั้งที่พวกเขาขอหน้า ดูเหมือนว่ารูปภาพจะมี "Cache-Control private, max-age = 3600" ปรากฏขึ้นใน Firebug แต่เบราว์เซอร์ยังคงร้องขอเมื่อฉันกด F5

คำตอบ:


128

หากคุณต้องการตั้งค่าส่วนหัว Cache-Control ไม่มีอะไรใน IIS7 UI ให้ทำน่าเศร้า

อย่างไรก็ตามคุณสามารถวาง web.config นี้ในรูทของโฟลเดอร์หรือไซต์ที่คุณต้องการตั้งค่าได้:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

ซึ่งจะแจ้งให้ไคลเอ็นต์แคชเนื้อหาเป็นเวลา 7 วันในโฟลเดอร์นั้นและโฟลเดอร์ย่อยทั้งหมด

คุณสามารถทำได้โดยแก้ไข IIS7 metabase ผ่านappcmd.exeดังนี้:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  ตั้งค่า config "เว็บไซต์ / โฟลเดอร์เริ่มต้น" 
  - ส่วน: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  ตั้งค่า config "เว็บไซต์ / โฟลเดอร์เริ่มต้น" 
  - ส่วน: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"

5
เอกสาร MSDN สำหรับองค์ประกอบคอนฟิกูเรชัน staticContent สามารถพบได้ที่นี่: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
ดูโพสต์ 360Airwalk ด้านล่างมี UI สำหรับสิ่งนี้ใน IIS7
ChadT

เช่นเดียวกับข้อมูล: การตั้งค่านี้ดูเหมือนจะไม่มีผลกับเซิร์ฟเวอร์การพัฒนาในตัว (อย่างน้อย VS 2010 SP1) หากมีข้อสงสัยว่าเหตุใดจึงใช้งานไม่ได้ให้ตรวจสอบกับ IIS

6
สวัสดี Jeff คุณทราบวิธีการให้บริการส่วนหัวCache-Control( max-age) ที่แตกต่างกันสำหรับ mime-types หรือไฟล์นามสกุลต่างๆหรือไม่?
Jasper

@Jeff Atwood บางทีคุณอาจช่วยฉันได้ ดูสิ่งนี้: stackoverflow.com/questions/57990579/…
Success Man

116

นั่นไม่ใช่เรื่องจริงของเจฟฟ์

คุณเพียงแค่ต้องเลือกโฟลเดอร์ภายใน IIS 7 Manager UI ของคุณ (เช่นรูปภาพหรือเหตุการณ์โฟลเดอร์ Default Web Application) จากนั้นคลิกที่ "HTTP Response Headers" จากนั้นคุณต้องคลิกที่ "Set Common Header .. " ในบานหน้าต่างด้านขวาและเลือก "Expire Web content" คุณสามารถกำหนดค่าอายุสูงสุด 24 ชั่วโมงได้อย่างง่ายดายโดยเลือก "After:" ป้อน "24" ในกล่องข้อความและเลือก "ชั่วโมง" ในกล่องผสม

ย่อหน้าแรกของคุณเกี่ยวกับรายการ web.config ถูกต้อง ฉันจะเพิ่ม cacheControlCustom-attribute เพื่อตั้งค่าส่วนหัวการควบคุมแคชเป็น "public" หรืออะไรก็ตามที่จำเป็นในกรณีนั้น

แน่นอนคุณสามารถบรรลุสิ่งเดียวกันได้โดยการจัดเตรียมรายการ web.config (หรือไฟล์) ตามต้องการ

แก้ไข: ลบประโยคที่สับสน :)


1
UI สำหรับการตั้งค่านี้แย่มาก แต่ขอบคุณที่อธิบายวิธีเดินทาง! +1
Billy Coover

อินเทอร์เฟซนี้สร้าง web.config ด้วยการกำหนดค่าเดียวกับที่ Jeff โพสต์ ดีที่รู้! ขอบคุณ!
RandyMorris

2
ขอบคุณสำหรับโพสต์ @ 360Airwalk คุณทราบวิธีให้บริการส่วนหัวCache-Control( max-age) ที่แตกต่างกันสำหรับ mime-types หรือไฟล์นามสกุลต่างๆหรือไม่?
Jasper

3
@Jasper: คุณสามารถตั้งค่าต่อโฟลเดอร์ได้ หากคุณตั้งค่าการควบคุมแคชในโฟลเดอร์ย่อยของโฟลเดอร์จะสืบทอดการตั้งค่า แต่คุณสามารถแทนที่ได้อีกเรื่อย ๆ คุณสามารถทำได้แบบต่อไฟล์ หากคุณไม่สามารถเข้าถึงคอนโซล iis คุณสามารถทำได้ผ่าน web.config เช่นกัน ดูโพสต์นี้สำหรับstackoverflow.com/questions/2195266/…
360Airwalk

28

ฉันใช้สิ่งนี้

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

เพื่อแคชเนื้อหาคงที่เป็นเวลา 500 วันด้วยส่วนหัวการควบคุมแคชสาธารณะ


10
แนวทางปฏิบัติที่แนะนำคือ 1 ปีเป็นหลัก 365 วันไม่เกิน
Anicho

5
500 วันเป็น BAD บทความที่พูดถึงกฎ RFC ที่บอกว่าอย่าตั้งค่าแคชให้กับผู้พัฒนามากกว่า 1 ปี google.com/speed/docs/best-practices/caching อย่าตั้งค่าให้เกินหนึ่งปีในอนาคต เนื่องจากละเมิดหลักเกณฑ์ RFC
foxontherock

@foxontherock วิธีใดที่คุณสามารถยืนยันกฎ RFC มากกว่า 365 วันว่าเป็นการปฏิบัติที่ไม่ดี? ฉันไม่พบสิ่งใดที่จะแนะนำสิ่งนี้ในเอกสารประกอบ ...
Paesano2000

@ เอลเมอร์บางทีคุณอาจช่วยฉันได้ ดูสิ่งนี้: stackoverflow.com/questions/57990579/…
Success Man

19

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

แต่ให้ลองนำทางไปที่อื่นแล้วย้อนกลับ

คุณสามารถบังคับให้รีเฟรชผ่าน 304 โดยกด ctrl ค้างไว้ในขณะที่กด f5 ในเบราว์เซอร์ส่วนใหญ่


18

เติมเต็มคำตอบของ Elmer เนื่องจากการแก้ไขของฉันถูกย้อนกลับ

ในการแคชเนื้อหาแบบคงที่เป็นเวลา 365 วันด้วยส่วนหัวการควบคุมแคชสาธารณะ IIS สามารถกำหนดค่าได้ดังต่อไปนี้

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

สิ่งนี้จะแปลเป็นส่วนหัวดังนี้:

Cache-Control: public,max-age=31536000

โปรดทราบว่า max-age เป็นเดลต้าในไม่กี่วินาทีถูกแสดงออกมาด้วยการเป็นจำนวนเต็มบวก 32bit ตามที่ระบุไว้ในRFC 2616 ส่วน 14.9.3 และ 14.9.4 ซึ่งแสดงถึงค่าสูงสุด 2 ^ 31 หรือ 2,147,483,648 วินาที (มากกว่า 68 ปี) อย่างไรก็ตามเพื่อให้แน่ใจว่าสามารถใช้งานร่วมกันได้ระหว่างไคลเอนต์และเซิร์ฟเวอร์เราจึงใช้เวลาสูงสุด 365 วันที่แนะนำ (หนึ่งปี)

ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ คุณสามารถใช้คำสั่งเหล่านี้ได้เช่นกันบน web.config ของไซต์ของคุณสำหรับเนื้อหาคงที่ทั้งหมด อีกทางเลือกหนึ่งคุณสามารถใช้ได้เฉพาะกับเนื้อหาในตำแหน่งที่เจาะจงด้วย (ในตัวอย่างแคชสาธารณะ 30 วันสำหรับเนื้อหาในโฟลเดอร์ "cdn"):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

Luciano ฉันพยายามแคชรูปภาพโดยใช้วิธีของคุณ ตอนนี้เมื่อฉันวิเคราะห์โดยใช้ HttpFox ฉันเห็นคำขอ 2 รายการสำหรับแต่ละภาพ 1. รายการแรกให้ผลลัพธ์ที่ถูกยกเลิกโดยมีข้อผิดพลาด (NS_BINDING_ABORTED) 2. คำขอที่สองเป็นรูปภาพที่แคชไว้ ความคิดใด ๆ ?
มิถิล

1

มีวิธีง่ายๆคือ 1. ใช้ web.config ของเว็บไซต์ 2. ในส่วน "staticContent" ให้ลบ fileExtension เฉพาะและเพิ่ม mimeMap 3. เพิ่ม "clientCache"

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.