2009-03-13 17 views
81

Tôi đang cố gắng làm điều gì đó mà tôi nghĩ sẽ khá đơn giản. Nhận IIS 7 để nói với khách hàng rằng họ có thể lưu trữ tất cả hình ảnh trên trang web của tôi trong một khoảng thời gian nhất định, giả sử 24 giờ.IIS7 Cache-Control

Tôi đã thử bước trên http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx nhưng không có kết quả. Tôi vẫn nhận được yêu cầu đến máy chủ với 304s đang được trả lại.

Có ai có cách làm việc này không? Tôi có một trang web đồ họa chuyên sâu và người dùng của tôi đang bị đóng búa (máy chủ của tôi) mỗi khi họ yêu cầu một trang. Wierdly những hình ảnh dường như có "Cache-Control tư nhân, max-age = 3600" hiển thị trong Firebug nhưng trình duyệt vẫn yêu cầu chúng khi tôi nhấn F5.

Trả lời

100

Nếu bạn muốn đặt tiêu đề Bộ nhớ cache kiểm soát, không có gì trong giao diện người dùng IIS7 để làm điều này, thật đáng buồn.

Bạn tuy nhiên có thể thả web.config này trong thư mục gốc của thư mục hoặc trang web mà bạn muốn cài đặt nó:

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

Điều đó sẽ thông báo cho khách hàng nội dung bộ nhớ cache cho 7 ngày trong thư mục đó và tất cả thư mục con.

Bạn cũng có thể làm điều này bằng cách chỉnh sửa metabase IIS7 qua appcmd.exe, như vậy:

 
\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMode:UseMaxAge 

\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMaxAge:"7.00:00:00" 
+5

Tài liệu MSDN cho phần tử cấu hình staticContent có thể tìm thấy tại đây: http://msdn.microsoft.com/en-us/library/ms689443.aspx –

+4

Xem bài đăng 360Airwalk bên dưới, có giao diện người dùng cho điều này trong IIS7 – ChadT

+0

Giống như thông tin : cài đặt này dường như không ảnh hưởng đến Máy chủ phát triển tích hợp (ít nhất là trong VS 2010 SP1). Nếu nghi ngờ tại sao nó không hoạt động, hãy kiểm tra với IIS. –

19

Làm mới F5 có ngữ nghĩa "vui lòng tải lại HTML hiện tại AND các phụ thuộc trực tiếp của nó". Do đó bạn nên mong đợi để xem bất kỳ tài nguyên imgs, css và js nào được tham chiếu trực tiếp bởi HTML cũng đang được nạp lại. Tất nhiên 304 là một phản ứng chấp nhận được với điều này nhưng làm mới F5 ngụ ý rằng trình duyệt sẽ thực hiện yêu cầu thay vì dựa vào nội dung bộ nhớ cache mới.

Thay vào đó, hãy thử chỉ cần điều hướng đến một nơi khác và sau đó điều hướng trở lại.

Bạn có thể buộc làm mới, quá 304, bằng cách giữ ctrl trong khi nhấn f5 ở hầu hết các trình duyệt.

+2

Bạn có nghĩa là Ctrl + F5 đúng! – Anicho

106

Đó là không đúng sự thật Jeff.

Bạn chỉ cần chọn một thư mục trong giao diện người quản lý IIS 7 (ví dụ: Hình ảnh hoặc sự kiện thư mục Ứng dụng Web mặc định) và sau đó nhấp vào "Tiêu đề phản hồi HTTP". Sau đó, bạn phải bấm vào "Set Common Header .." trong khung bên phải và chọn "Expire Web content". Ở đó bạn có thể dễ dàng cấu hình tối đa 24 giờ bằng cách chọn "After:", nhập "24" trong Textbox và chọn "Hours" trong combobox.

Đoạn đầu tiên của bạn về mục nhập web.config là đúng. Tôi sẽ thêm cacheControlCustom-attribute để đặt tiêu đề điều khiển bộ nhớ cache thành "công khai" hoặc bất kỳ điều gì cần thiết trong trường hợp đó.

Bạn có thể, tất nhiên, đạt được điều tương tự bằng cách cung cấp các mục nhập web.config (hoặc tệp) nếu cần.

Edit: loại bỏ một câu khó hiểu :)

+1

Giao diện người dùng cho cài đặt này thật khủng khiếp. Nhưng cảm ơn vì đã giải thích cách đến đó! +1 –

+0

Giao diện này tạo web.config với cùng cấu hình như Jeff đã đăng. Rất vui được biết! Cảm ơn! – RandyMorris

+2

Cảm ơn bài đăng @ 360Airwalk. Bạn có biết cách phân phối các tiêu đề 'Cache-Control' (' max-age') khác nhau cho các loại mime khác nhau hoặc phần mở rộng tệp không? – Jasper

21

tôi sử dụng này

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

để cache nội dung tĩnh cho 500 ngày với tiêu đề nào bộ nhớ cache kiểm soát.

+9

thực tiễn được khuyến nghị sau 1 năm thực chất là 365 ngày không còn nữa. – Anicho

+5

500 ngày là BAD, bài viết nói về quy tắc RFC yêu cầu không đặt bộ nhớ cache thành hơn 1 năm https://developers.google.com/speed/docs/best-practices/caching Không được đặt nó đến hơn một năm trong tương lai, vì điều đó vi phạm các nguyên tắc của RFC. – foxontherock

16

Bổ sung câu trả lời của Elmer, khi chỉnh sửa của tôi được khôi phục.

Để bộ nhớ cache nội dung tĩnh cho 365 ngày với công chúng tiêu đề bộ nhớ cache kiểm soát, IIS có thể được cấu hình như sau

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

này sẽ chuyển thành một tiêu đề như thế này:

Cache-Control: public,max-age=31536000 

Lưu ý rằng độ tuổi tối đa là một đồng bằng tính bằng giây, được biểu diễn bằng số nguyên 32 bit dương như được nêu trong RFC 2616 Sections 14.9.3 and 14.9.4. Điều này thể hiện giá trị tối đa là 2^31 hoặc 2,147,483,648 giây (trên 68 năm). Tuy nhiên, để đảm bảo khả năng tương thích tốt hơn giữa khách hàng và máy chủ, chúng tôi áp dụng tối đa 365 ngày được đề nghị (một năm).

Như đã đề cập trên các câu trả lời khác, bạn cũng có thể sử dụng các chỉ thị này trên web.config của trang web của bạn cho tất cả nội dung tĩnh. Là một thay thế, bạn có thể sử dụng nó chỉ cho nội dung ở một vị trí cụ thể quá (trên mẫu, 30 ngày bộ nhớ cache nào cho nội dung trong "cdn" thư mục):

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

Luciano, Tôi đang cố gắng lưu hình ảnh của mình bằng phương pháp của mình. Bây giờ khi tôi phân tích bằng cách sử dụng HttpFox tôi thấy 2 yêu cầu được thực hiện cho mỗi hình ảnh. 1. Đầu tiên đưa ra kết quả bị hủy bỏ với lỗi (NS_BINDING_ABORTED) 2. yêu cầu thứ hai là hình ảnh được lưu trong bộ nhớ cache. Bất kỳ suy nghĩ nào? – Mithil

-1

có một cách dễ dàng: 1. sử dụng web.config website của 2. trong phần "staticContent" loại bỏ fileExtension cụ thể và thêm mimeMap 3. add "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>