2010-06-07 53 views
11

Tôi không chắc liệu đây có phải là sự cố máy chủ hay không hoặc liệu tôi có hiểu được cách bộ đệm HTTP thực sự hoạt động hay không.Lỗi nhầm lẫn HTTP caching

Tôi có ứng dụng ASP MVC chạy trên IIS7. Có rất nhiều nội dung tĩnh như một phần của trang web bao gồm rất nhiều tệp CSS, Javascript và hình ảnh.

Đối với những tệp này, tôi muốn trình duyệt lưu chúng trong ít nhất một ngày - các tệp .css, .js, .gif và .png của chúng tôi hiếm khi thay đổi.

web.config của tôi đi như thế này:

<system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" 
        cacheControlMaxAge="1.00:00:00" /> 
    </staticContent> 
</system.webServer> 

Vấn đề tôi nhận được là trình duyệt (thử nghiệm Chrome, IE8 và FX) dường như không được bộ nhớ đệm các tập tin như tôi muốn chờ đợi. Tôi đã có các thiết lập mặc định (kiểm tra các trang mới hơn tự động trong IE).

Trong chuyến viếng thăm đầu tiên tải nội dung như mong đợi

HTTP/1.1 200 OK 
Cache-Control: max-age=86400 
Content-Type: image/gif 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:29:16 GMT 
Content-Length: 918 

<content> 

Tôi nghĩ rằng Cache-Control: max-age=86400 nên nói với các trình duyệt không yêu cầu trang một lần nữa cho một ngày.

Ok, vậy bây giờ trang được tải lại và trình duyệt yêu cầu lại hình ảnh. Lần này nó được phản hồi trống với các tiêu đề:

HTTP/1.1 304 Not Modified 
Cache-Control: max-age=86400 
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT 
Accept-Ranges: bytes 
ETag: "3efeb2294517ca1:0" 
Server: Microsoft-IIS/7.0 
X-Powered-By: ASP.NET 
Date: Mon, 07 Jun 2010 14:30:32 GMT 

Vì vậy, nó trông giống như trình duyệt đã gửi ETag lại (như là một id duy nhất cho tài nguyên), và của máy chủ trở lại với một 304 Not Modified - cho trình duyệt biết rằng nó có thể sử dụng tệp đã tải xuống trước đó.

Dường như với tôi điều đó sẽ đúng cho nhiều tình huống lưu vào bộ nhớ cache, nhưng ở đây tôi không muốn có thêm chuyến đi khứ hồi. Tôi không quan tâm nếu hình ảnh bị lỗi thời khi tệp trên máy chủ thay đổi.

Có rất nhiều tệp này (ngay cả với bản đồ sprite và các loại tương tự) và nhiều khách hàng của chúng tôi có mạng rất chậm. Mỗi chuyến đi khứ hồi để ping cho trạng thái này mất khoảng 10 đến 5 giây. Nhiều người cũng có IE6 chỉ có 2 kết nối HTTP tại một thời điểm. Kết quả thực là ứng dụng của chúng tôi dường như rất chậm đối với những khách hàng này với mỗi trang mất thêm vài giây để kiểm tra xem nội dung tĩnh có thay đổi hay không.

Tôi đang thiếu tiêu đề phản hồi nào khiến trình duyệt tích cực lưu vào bộ nhớ cache?

Tôi làm cách nào để thiết lập điều này trong web.config cho IIS7?

Tôi có hiểu nhầm về cách hoạt động của bộ đệm ẩn HTTP ở địa điểm đầu tiên không?

+0

Bạn có thể tắt ETag không? Điều đó có thể khắc phục bạn, nhưng tôi không chắc chắn. –

+0

Tôi sẽ thử loại bỏ ETag, nhưng đối với máy chủ thử nghiệm của tôi có vẻ khớp với – Keith

+6

Nếu bạn nhấn làm mới hoặc F5, trình duyệt sẽ luôn yêu cầu máy chủ (có thể là yêu cầu có điều kiện) bất kể cài đặt bộ nhớ cache –

Trả lời

5

sử dụng tiêu đề hết hạn thay vì sử dụng kiểm soát bộ nhớ cache. Cho phép máy chủ của bạn lần đầu tiên phân phát nội dung từ bộ nhớ cache của trình duyệt cho đến ngày hết hạn này. Sẽ không có kiểm tra chéo cho những thay đổi trong tập tin cho đến ngày hết hạn của bạn.

thêm tiêu đề trong phần system.webServer của web.config của bạn như sau:

<system.webServer> 
    <staticContent> 
     <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" 
        cacheControlMode="UseExpires" />; 
    </staticContent> 
</system.webServer> 
+0

Làm thế nào tôi sẽ làm điều đó trong IIS7? Ngoài ra - tại sao nó hoạt động khi 'cache-control' không? – Keith

+0

Cảm ơn bạn đã làm rõ - vì vậy 'cache-control' đã bị hỏng? – Keith

+0

không có tôi tin rằng có một cái gì đó cả bạn và tôi đang thiếu tôi đang đọc thêm về kiểm soát bộ nhớ cache tại thời điểm này sẽ cho bạn biết nếu tôi tìm ra rõ ràng. Có nhưng đề xuất của tôi đã làm việc cho bạn –

6

Bạn cần phải sử dụng Hết hạn chỉ thị, nếu không thì trình duyệt sẽ luôn luôn kiểm tra để xem nếu nội dung đã được cập nhật.

Nếu mục nhập được lưu trong bộ nhớ cache có ngày hết hạn hợp lệ, trình duyệt có thể sử dụng lại nội dung mà không phải liên hệ với máy chủ khi trang hoặc trang web được xem lại. Điều này làm giảm đáng kể số lượng các chuyến đi vòng quanh mạng cho các trang được truy cập thường xuyên. Ví dụ: biểu trưng của Google được đặt hết hạn vào năm 2038 và sẽ chỉ được tải xuống trong lần truy cập đầu tiên của bạn vào google.com hoặc nếu bạn đã làm trống bộ nhớ cache của trình duyệt. Nếu họ muốn thay đổi hình ảnh, họ có thể sử dụng tên hoặc đường dẫn tệp hình ảnh khác.

Để thay đổi việc sử dụng IIS7 sau. Đây là cách dễ nhất để quản lý nếu bạn giữ nội dung tĩnh trong các thư mục cụ thể.

Đăng nhập vào máy chủ
Mở IIS Manager (bắt đầu -> công cụ adminstrative -> IIS Manager
Mở rộng nút máy chủ
Mở rộng trang web nút
mở trang web và điều hướng đến thư mục mà bạn muốn thay đổi
Mở IIS phản hồi HTTP Headers phần
Bấm Set Headers phổ biến trên khung tác vụ bên phải
Set "Hết Hạn Web Content" như ứng dụng của bạn yêu cầu.

+1

Cảm ơn - các bước của bạn trong IIS7 sẽ thực sự tạo ra cùng một XML web.config mà là trong câu hỏi của tôi mặc dù. – Keith

-1

Short anwser: loại bỏ Etag và sử dụng Expire header.

Bạn nên kiểm tra 35 Yahoo Performance best practices, và đặc biệt hơn:

Đối với mỗi quy tắc, họ thường che Cấu hình máy chủ web Apache và IIS.

Chỉnh sửa: OK, có vẻ như không có cách đơn giản nào để xóa Etags trong IIS, besides installing some 3rd party software ...

+0

Thật không may là dường như không thể loại bỏ ETags trên IIS7 - xem http://stackoverflow.com/questions/477913 – Keith

+0

Tại sao tiêu đề 'expire' hoạt động khi' cache-control' không? Chúng tôi không phải hỗ trợ IE5 và mọi thứ trong quá khứ hỗ trợ HTTP 1.1 – Keith

+0

Cảm ơn câu trả lời (+1).'Expires' và' Cache-Control' hoạt động tốt như nhau (trừ khi bạn đang ở trên IE5 hoặc thấp hơn, sau đó chỉ 'Expires' hiện) miễn là hoặc được thiết lập là bạn tốt. Hóa ra vấn đề thực tế của tôi là tôi đã nhấn F5/refresh để kiểm tra, và điều đó luôn khiến trình duyệt ping cho mỗi tập tin và nhận được câu trả lời _304 Not Modified_. – Keith