Using IIS7 why are my PNGs being cached by the browser, but my JS and CSS files not?
Posted
by
Craig Shearer
on Server Fault
See other posts from Server Fault
or by Craig Shearer
Published on 2012-04-12T22:06:05Z
Indexed on
2012/04/12
23:32 UTC
Read the original article
Hit count: 320
iis7
I am trying to sort out caching in IIS for my site.
Basically, I want nothing cached, except for .png, .js, and .css files.
At my site level, I opened the HTTP Reponse Headers and used the "Set Common Hedaers..." to set content to expire immediately.
I have no Output Caching profiles set at any level in IIS.
I clear my browser cache then try accessing my site. When my site requests a PNG file, I see responses like:
Accept-Ranges bytes
Age 0
Connection Keep-Alive
Content-Type image/png
Date Thu, 12 Apr 2012 21:55:15 GMT
Etag "83b7322de318cd1:0"
Last-Modified Thu, 12 Apr 2012 19:33:45 GMT
Server Microsoft-IIS/7.5
X-Powered-By ASP.NET
For JS and CSS files, I see responses like:
Accept-Ranges bytes
Cache-Control no-cache
Connection Keep-Alive
Content-Encoding gzip
Content-Length 597
Content-Type text/css
Date Thu, 12 Apr 2012 21:55:15 GMT
Etag "06e45ede15bca1:0"
Last-Modified Mon, 02 Nov 2009 17:28:44 GMT
Server Microsoft-IIS/7.5
Vary Accept-Encoding
X-Powered-By ASP.NET
Accept-Ranges bytes
Cache-Control no-cache
Connection Keep-Alive
Content-Encoding gzip
Content-Length 42060
Content-Type application/x-javascript
Date Thu, 12 Apr 2012 21:55:14 GMT
Etag "2356302de318cd1:0"
Last-Modified Thu, 12 Apr 2012 19:33:45 GMT
Server Microsoft-IIS/7.5
Vary Accept-Encoding
X-Powered-By ASP.NET
So, why are my PNGs able to be cached, but JS and CSS files not?
Then, I go into the Output Caching feature in IIS and set up profiles for .png, .css, and .js files. This updates the web.config file as follows:
<caching>
<profiles>
<add extension=".png" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".css" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
<add extension=".js" policy="CacheUntilChange" kernelCachePolicy="DontCache" />
</profiles>
</caching>
I do a "precautionary" IISReset then try accessing my site again.
For PNG files, I see the following response:
Accept-Ranges bytes
Age 0
Connection Keep-Alive
Content-Length 3833
Content-Type image/png
Date Thu, 12 Apr 2012 22:02:30 GMT
Etag "0548c9e2c5dc81:0"
Last-Modified Tue, 22 Jan 2008 19:26:00 GMT
Server Microsoft-IIS/7.5
X-Powered-By ASP.NET
For CSS and JS files, I see the following responses:
Accept-Ranges bytes
Cache-Control no-cache,no-cache
Connection Keep-Alive
Content-Encoding gzip
Content-Length 2680
Content-Type application/x-javascript
Date Thu, 12 Apr 2012 22:02:29 GMT
Etag "0f743af9015c81:0"
Last-Modified Tue, 23 Oct 2007 16:20:54 GMT
Server Microsoft-IIS/7.5
Vary Accept-Encoding
X-Powered-By ASP.NET
Accept-Ranges bytes
Cache-Control no-cache,no-cache
Connection Keep-Alive
Content-Encoding gzip
Content-Length 3831
Content-Type text/css
Date Thu, 12 Apr 2012 22:02:29 GMT
Etag "c3f42d2de318cd1:0"
Last-Modified Thu, 12 Apr 2012 19:33:45 GMT
Server Microsoft-IIS/7.5
Vary Accept-Encoding
X-Powered-By ASP.NET
What am I doing wrong? Have I completely misunderstood the features of IIS, or is there a bug.
Most importantly, how do I achieve what I want - that is get the browser to cache only PNG, JS and CSS files?
© Server Fault or respective owner