2016-04-22 33 views
6

Tôi đang lưu trữ một ứng dụng web trên Azure với Web.config như sau:Làm cách nào để áp dụng các thiết lập <clientCache /> cho một phần mở rộng cụ thể trong IIS?

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <staticContent> 
     <mimeMap fileExtension=".text" mimeType="text/plain" /> 
     <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" /> 
    </staticContent> 
    </system.webServer> 
</configuration> 

này hoạt động nhưng tôi muốn thay đổi tuổi nhớ cache bằng cách mở rộng. Tôi muốn đặt độ tuổi tối đa của tệp .html thành 1 ngày và độ tuổi tối đa của mọi thứ khác là 365 ngày. Lý do là tất cả các tài sản trong html có tên tập tin của họ được sửa đổi và được phục vụ từ CDN, vì vậy chúng không bao giờ cần hết hạn, nhưng các trang html cần phải luôn tươi mới để người dùng có thể xem nội dung mới.

Tôi thấy rằng phần tử <location> cho phép lọc Web.config đến các vị trí cụ thể, nhưng tôi không thấy cách giới hạn nó với các tiện ích nhất định.

Xin lưu ý rằng tôi không yêu cầu có thể thực hiện việc này trong Web.config: mọi cách có thể với Azure Web App đều ổn.

Trả lời

6

Vì những người khác đã đề cập đến điều này là không thể nên tôi muốn đề xuất cách giải quyết để thực hiện công việc.
Bạn có thể tận dụng khả năng của Mô-đun Rewrite URL bằng cách tạo quy tắc đi để thay thế tiêu đề Cache-Control của các tệp html.

Đây là cấu hình.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <staticContent> 
      <mimeMap fileExtension=".text" mimeType="text/plain" /> 
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" /> 
     </staticContent> 
     <rewrite> 
      <outboundRules> 
       <rule name="RewriteCacheControlForHTMLFiles" preCondition="FileEndsWithHtml"> 
        <match serverVariable="RESPONSE_Cache_Control" pattern=".*" /> 
        <action type="Rewrite" value="max-age=86400" /> 
       </rule> 
       <preConditions> 
        <preCondition name="FileEndsWithHtml"> 
         <add input="{REQUEST_FILENAME}" pattern="\.html$" /> 
        </preCondition> 
       </preConditions> 
      </outboundRules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

Một ảnh chụp màn hình của thử nghiệm của tôi:

enter image description here

+0

Cách giải quyết được đề xuất bên dưới để di chuyển nội dung của tôi xung quanh cũng sẽ hoạt động tốt, nhưng điều này đơn giản hơn và ít hoạt động hơn. Cảm ơn! – Alan

+0

bạn được chào đón @Alan –

2

Những tệp này (html vs nội dung) trong các thư mục riêng biệt phải không? Nếu vậy, bạn có thể thiết lập một thư mục bộ nhớ đệm cụ thể tuổi

<configuration> 
<location path="[html files path]"> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="[your requirement]" ></clientCache> 
     </staticContent> 
    </system.webServer> 
    </location> 
</configuration> 
+0

Không, họ đang tất cả xen kẽ. Ví dụ. Có /articles/article1/index.html và /articles/article1/figure1.png – Alan

1

Thật không may là yếu tố <location> không hỗ trợ regex hoặc wildcards do đó bạn sẽ không thể thực hiện chính xác những gì bạn đang yêu cầu.

Tôi có thể nghĩ ra một vài cách để đạt được mục tiêu của bạn. Đầu tiên là write an http module chặn các yêu cầu đến hình ảnh và thay đổi tiêu đề bộ nhớ đệm.

Tùy chọn khác là để lại html của bạn không thay đổi nhưng để di chuyển tất cả hình ảnh của bạn sang thư mục hình ảnh. Sau đó, bạn có thể đặt quy tắc bộ nhớ đệm trên thư mục đó. Bạn có thể sử dụng quy tắc chuyển hướng để chuyển hướng các yêu cầu cho hình ảnh tới thư mục hình ảnh đó. Nếu bạn chọn con đường này tôi có thể cung cấp cho bạn thêm thông tin về cách bạn có thể thiết lập nó.

+0

Nếu tôi thực hiện tất cả yêu cầu CDN đến trong thư mục con, liệu có thể có quy tắc bộ nhớ cache cho thư mục con đó và sau đó viết lại thư mục phụ không? Ví dụ: 1. yêu cầu đến máy chủ.com/CDN/articles/article1/foo.jpg 2. yêu cầu được hết hạn bộ nhớ cache dài được áp dụng 3. yêu cầu được viết lại cho host.com/articles/article1/foo. jpg 4. foo.jpg được phục vụ từ/bài viết/article1 – Alan

+1

Tôi không nghĩ rằng điều này sẽ làm việc vì [cách IIS xử lý viết lại] (http://www.iis.net/learn/extensions/url- rewrite-module/iis-url-rewriting-và-aspnet-routing). Viết lại diễn ra rất sớm trên đường ống xử lý yêu cầu.Theo như các phần thấp hơn của các đường ống có liên quan, yêu cầu đến từ url viết lại và do đó bạn kết thúc với cùng một vấn đề. Không thực tế để có bước xây dựng di chuyển tất cả hình ảnh vào một thư mục khác? – Sudsy

+0

Cảm ơn bạn đã dành thời gian trả lời và tiết kiệm cho tôi sự cố khi cố gắng thực hiện điều này. Có thể di chuyển tất cả nội dung vào một thư mục cấp cao nhất, ví dụ: "di chuyển tất cả hình ảnh vào/hình ảnh" và cứ thế cho tất cả các loại nội dung, nhưng sẽ là thực tế để di chuyển tất cả nội dung vào các thư mục con đại diện cho nhóm nội dung của chúng. Ví dụ. Tôi sẽ phải di chuyển host.com/CDN/articles/article1/foo.jpg vào cdn.host.com/images/foo.jpg, bởi vì mọi thứ khác sẽ liên quan đến việc sửa đổi HTML để trỏ đến vị trí mới. Mà cũng hoàn toàn có thể làm được nhưng gây phiền nhiễu. – Alan

Các vấn đề liên quan