如何设置 Cache-Control header 以便缓存动态内容?
How to set Cache-Control header in order to cache dynamic content?
假设我必须为我的网站提供可以随时更新的动态内容。我想缓存数据以获得最佳性能。
我认为最准确的做法是只要数据未更改就将数据保留在缓存中。所以它涉及使用 no-cache
选项。
问题是我不知道这是否真的是一个好的选择。每次有人请求这些数据时,缓存服务器都会请求原始服务器并询问数据是否从那时起发生了变化。所以我不知道 no-store
选项有什么区别,根本不缓存数据(就性能而言)。我的意思是我认为 bandwitdh 音量将以相同的方式使用(我说的对吗?)
所以,如果每次发出请求,我的缓存服务器都必须检查源服务器,那么与直接请求源服务器有什么区别?
是否有任何选项可以设置缓存,以便在且仅实际发生更新时获取新数据?
ETags 是一种方法。如果您可以将一个合理的简短、唯一的字符串与您的动态内容相关联,那么您可以在 HTTP 响应 headers 中使用该标识符作为:
Cache-Control: public, must-revalidate, max-age=60
ETag: <content identifer>
重要的是内容标识符随着内容的变化而变化,因此例如使用内容的十六进制编码散列就可以了。然后,客户端将通过在 GET 请求中发送 In-None-Match header 来使用 ETag:
If-None-Match: <previous etag>
如果内容的 ETag 没有改变,服务器应该发送一个 304 Not Modified 响应,否则发送一个包含更新内容和新 ETag 的完整 200 OK 响应。
服务器上支持If-Modified-Since header的其他选项。 header 仅当内容自指定日期以来已被修改时才允许客户端请求内容,否则服务器应 return 没有内容的 304 Not Modified 响应。
假设我必须为我的网站提供可以随时更新的动态内容。我想缓存数据以获得最佳性能。
我认为最准确的做法是只要数据未更改就将数据保留在缓存中。所以它涉及使用 no-cache
选项。
问题是我不知道这是否真的是一个好的选择。每次有人请求这些数据时,缓存服务器都会请求原始服务器并询问数据是否从那时起发生了变化。所以我不知道 no-store
选项有什么区别,根本不缓存数据(就性能而言)。我的意思是我认为 bandwitdh 音量将以相同的方式使用(我说的对吗?)
所以,如果每次发出请求,我的缓存服务器都必须检查源服务器,那么与直接请求源服务器有什么区别?
是否有任何选项可以设置缓存,以便在且仅实际发生更新时获取新数据?
ETags 是一种方法。如果您可以将一个合理的简短、唯一的字符串与您的动态内容相关联,那么您可以在 HTTP 响应 headers 中使用该标识符作为:
Cache-Control: public, must-revalidate, max-age=60
ETag: <content identifer>
重要的是内容标识符随着内容的变化而变化,因此例如使用内容的十六进制编码散列就可以了。然后,客户端将通过在 GET 请求中发送 In-None-Match header 来使用 ETag:
If-None-Match: <previous etag>
如果内容的 ETag 没有改变,服务器应该发送一个 304 Not Modified 响应,否则发送一个包含更新内容和新 ETag 的完整 200 OK 响应。
服务器上支持If-Modified-Since header的其他选项。 header 仅当内容自指定日期以来已被修改时才允许客户端请求内容,否则服务器应 return 没有内容的 304 Not Modified 响应。