跳到内容

针对 HTTP 缓存改变响应

编辑此页

到目前为止,我们一直假设每个 URI 都只有一个目标资源的表示形式。 默认情况下,HTTP 缓存通过使用资源的 URI 作为缓存键来完成。 如果两个人请求同一个可缓存资源的 URI,则第二个人将收到缓存的版本。

有时这还不够,需要根据一个或多个请求头值缓存同一 URI 的不同版本。 例如,如果当客户端支持压缩时您压缩页面,则任何给定的 URI 都有两种表示形式:一种是客户端支持压缩时的表示形式,另一种是客户端不支持压缩时的表示形式。 这种确定是通过 Accept-Encoding 请求头的值来完成的。

在这种情况下,您需要缓存存储特定 URI 的响应的压缩版本和未压缩版本,并根据请求的 Accept-Encoding 值返回它们。 这是通过使用 Vary 响应头完成的,Vary 响应头是以逗号分隔的不同标头列表,这些标头的值会触发请求资源的不同表示形式

1
Vary: Accept-Encoding, User-Agent

提示

这个特定的 Vary 标头将根据 URI 以及 Accept-EncodingUser-Agent 请求标头的值缓存每个资源的不同版本。

通过 Response 对象方法或 #[Cache] 属性设置 Vary 标头

1
2
3
4
5
6
7
8
9
10
11
// this attribute takes an array with the name of the header(s)
// names for which the response varies
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(vary: ['Accept-Encoding'])]
#[Cache(vary: ['Accept-Encoding', 'User-Agent'])]
public function index(): Response
{
    // ...
}
本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可证获得许可。
目录
    版本