IIS7 Cache-Control


95

Tôi đang cố gắng làm một việc mà tôi nghĩ sẽ khá đơn giản. Nhận IIS 7 cho khách hàng biết họ có thể lưu vào bộ nhớ cache 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ử là 24 giờ.

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 chuyển đến máy chủ với 304s được trả về.

Có ai có một cách để làm điều này? Tôi có một trang web chuyên sâu về đồ họa và người dùng của tôi đang bị tấn công (máy chủ của tôi cũng vậy) mỗi khi họ yêu cầu một trang. Chắc chắn là các hình ảnh dường như có "Cache-Control private, 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.

Câu trả lời:


124

Nếu bạn muốn đặt tiêu đề Cache-Control, không có gì trong IIS7 UI để thực hiện việc này, thật đáng buồn.

Tuy nhiên, bạn có thể thả web.config này vào thư mục gốc của thư mục hoặc trang web mà bạn muốn đặ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 lưu nội dung vào bộ nhớ cache trong 7 ngày trong thư mục đó và tất cả cá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 siêu dữ liệu IIS7 thông qua appcmd.exe, như sau:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  đặt cấu hình "Trang web mặc định / thư mục" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  đặt cấu hình "Trang web mặc định / thư mục" 
  -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ể được tìm thấy tại đây: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
Xem 360Airwalk bài viết dưới đây, có giao diện người dùng cho điều này trong IIS7
ChadT

Chỉ là một 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 sẵn (ít nhất là VS 2010 SP1). Nếu nghi ngờ tại sao nó không hoạt động, hãy kiểm tra với IIS.

6
Xin chào Jeff, bạn có biết cách phân phát các tiêu đề Cache-Control( max-age) khác nhau cho các loại mime hoặc phần mở rộng tệp khác nhau không?
Jasper

@Jeff Atwood Có lẽ bạn có thể giúp tôi. Nhìn vào cái này: stackoverflow.com/questions/57990579/…
Người đàn ông thành công

115

Đó không phải là sự thật Jeff.

Bạn chỉ cần chọn một thư mục trong Giao diện người dùng IIS 7 Manager của mình (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 nhấp vào "Đặt tiêu đề chung .." trong ngăn bên phải và chọn "Nội dung web hết hạn". Ở đó, bạn có thể dễ dàng định cấu hình độ tuổi tối đa là 24 giờ bằng cách chọn "Sau:", nhập "24" vào Hộp văn bản và chọn "Giờ" trong hộp kết hợp.

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

Tất nhiên, bạn có thể đạ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: bỏ một câu khó hiểu :)


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

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

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

3
@Jasper: bạn có thể đặt nó cho từng thư mục chẳng hạn. nếu bạn đặt kiểm soát bộ nhớ cache trên một thư mục con của thư mục sẽ kế thừa cài đặt nhưng bạn có thể ghi đè nó một lần nữa, v.v. bạn thậm chí có thể làm điều đó trên cơ sở từng tệp. nếu bạn không thể truy cập bảng điều khiển iis, bạn cũng có thể làm điều đó qua web.config. xem bài đăng này cho stackoverflow.com/questions/2195266/…
360Airwalk

27

Tôi sử dụng cái này

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

để lưu nội dung tĩnh vào bộ nhớ cache trong 500 ngày với tiêu đề kiểm soát bộ nhớ cache công khai.


10
Thông lệ khuyến nghị là 1 năm về cơ bản là 365 ngày không hơn.
Anicho

5
500 ngày là XẤU, bài báo nói về một quy tắc RFC yêu cầu không đặt bộ nhớ cache trong hơn 1 năm Develop.google.com/speed/docs/best-practices/caching Đừng đặt nó thành hơn một năm trong tương lai , vì điều đó vi phạm các nguyên tắc RFC.
foxontherock

@foxontherock có cách nào bạn có thể chứng minh quy tắc RFC của hơn 365 ngày là hành vi xấu không? Tôi không thể tìm thấy bất cứ điều gì để đề nghị này trong tài liệu ...
Paesano2000

@Elmer Có lẽ bạn có thể giúp tôi. Nhìn vào cái này: stackoverflow.com/questions/57990579/…
Người đàn ông thành công

19

F5 Refresh có ngữ nghĩa là "vui lòng tải lại HTML hiện tại các yếu tố phụ thuộc trực tiếp của nó". Do đó, bạn sẽ thấy mọi tài nguyên imgs, css và js được tham chiếu trực tiếp bởi HTML cũng đang được tìm lại. Tất nhiên, 304 là một phản hồi có thể chấp nhận được cho điều này nhưng F5 refresh 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ử đơn giả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, vượt qua 304, bằng cách giữ ctrl trong khi nhấn f5 trong hầu hết các trình duyệt.


18

Bổ sung cho câu trả lời của Elmer, khi bản chỉnh sửa của tôi đã được lùi lại.

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

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

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

Cache-Control: public,max-age=31536000

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

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

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

Luciano, tôi đang cố gắng lưu hình ảnh của mình vào bộ nhớ cache bằng phương pháp của bạn. Bây giờ khi tôi phân tích bằng HttpFox, tôi thấy 2 yêu cầu được thực hiện cho mỗi hình ảnh. 1. Yêu cầu đầ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à một hình ảnh được lưu trong bộ nhớ cache. Có suy nghĩ gì không?
Mithil

1

có một cách dễ dàng: 1. sử dụng web.config của trang web 2. trong phần "staticContent", hãy xóa tệp cụ thểExtension và thêm mimeMap 3. thêm "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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.