多样化的HTTP缓存响应

3.4 版本
维护中的版本

到现在为止,一直在假定,每一个URI都只能对应目标资源的某一个表现层。默认条件下,HTTP缓存使用的是资源的URI作为缓存的键。如果两个人请求的是某个缓存资源的同一个URI,则第二个人将收到被缓存的响应。

但有时这还不够,同一URI的不同版本需要被缓存,基于一或多个请求头的值。例如,如果你针对受支持的客户端来压缩页面,则任何一个URI会变为两个表现层:一个是客户端支持压缩时的,另一个则是当客户端不支持压缩时的。这种判断,将交由Accept-Encoding请求头的值来处理。

本例中,你需要让缓存为某特定URI来存储压缩的和未经压缩的两个版本的响应,然后基于请求中的Accept-Encoding值来决定返回哪一个。这是通过Vary响应头来实现的,它是个用英文逗号分隔的不同头的列表,每个头的值可以用来激发一个请求资源的不同表现层。

1
Vary: Accept-Encoding, User-Agent

这个特定的Vary头,将基于URI,以及Accept-EncodingUser-Agent请求头的值,去缓存每一个资源的不同版本。

Response提供了一个简明接口,用于管理Vary头:

1
2
3
4
5
// set one vary header 设置一个Vary头
$response->setVary('Accept-Encoding');
 
// set multiple vary headers 设置多个Vary头
$response->setVary(array('Accept-Encoding', 'User-Agent'));

setVary()方法接收的参数可以是一个头名称,或是一个专为不同的响应缓存而准备的“头名称”的数组。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)