I know this question is asked for several times. But Still I am not clear about the concept. After reading many blogs and answers in SO what I got is,

```
Expiry headers are used when you don’t even want client (and proxies/caches) to make a request to  
the server. In ETAG, the client will check with the server for the update, but in expiry 
headers, the client will know, when to expire the file and check for an update, till then it
(browsers and proxies/caches) won’t bother server for checking the update.

```

So basically it say if we use expires/max-age header , It will not even check for the server for an updated file. So I thought to test it locally. 

So I have created on simple html file including 2 js files and 1 image file. In IIS , I have set the Expires header to 2 days for the image folder. So as per my understanding , after getting the image file from the server once, for next request it should not send a request to the server to check the image file is modified or not. 

But what I got is each time I refresh the page I see a request sent to the server and the server returns a `304 not modified` status. But as per the specs/blogs I read It should not send a request to the server.

Someone please explain.

![enter image description here](https://i.stack.imgur.com/FBWHz.png)