HTTP caching is an efficient way to make your application scalable and achieve great response times under heavy load. The basic assumption of HTTP caching is that, at least for some time, the same web request will lead to an identical response. As long as “same” means simply the same domain name and path, you will get many cache hits. When users are logged in, we have the opposite situation, where potentially everybody will see different content. Lets take a closer look to see where we can still find safe uses for HTTP caching even with logged in users.
Controlling the HTTP Cache Behaviour
A HTTP request is not only the URL, but also the headers. Some are only for statistics or not relevant for your application. But for some web applications, there are relevant headers. The
Accept-Language header can be used to decide on the content language, or when building an API, the
Accept header can be used to choose whether to encode the answer in JSON or XML.
HTTP responses can use the header
Vary to declare what headers lead to distinct responses on the same URL. A HTTP cache uses the
Vary to keep the variants of the same URL apart. This works well when there are few variants – you will still get frequent cache hits. However, if every request comes with a different header, caching on the server side makes no sense anymore. There is no benefit in storing results in the cache that will rarely be reused. Even worse, this is a waste of resources that should be used for caching relevant data.
For this reason, caching proxies like Varnish will by default not attempt any caching as soon as there is a
Cookie header present in the request. Cookies are commonly used to track a session in the application, meaning the user might see a personalized page that can not be shared with any other user. If you force caching with cookies and have your application send a
Vary: Cookie header, you will have the situation described above, where you get no value out of your cache.
The rest of this article will dig into various aspects of what you can do to still do some HTTP caching:
- Avoid Session Cookie, remove when no longer needed
- Different cache rules for different parts
- User Context: Cache by permission group
Continue reading about Going Crazy with Caching – HTTP Caching and Logged in Users
Tags: varnish, caching