针对 HTTP 缓存改变响应
到目前为止,我们一直假设每个 URI 都只有一个目标资源的表示形式。 默认情况下,HTTP 缓存通过使用资源的 URI 作为缓存键来完成。 如果两个人请求同一个可缓存资源的 URI,则第二个人将收到缓存的版本。
有时这还不够,需要根据一个或多个请求头值缓存同一 URI 的不同版本。 例如,如果当客户端支持压缩时您压缩页面,则任何给定的 URI 都有两种表示形式:一种是客户端支持压缩时的表示形式,另一种是客户端不支持压缩时的表示形式。 这种确定是通过 Accept-Encoding
请求头的值来完成的。
在这种情况下,您需要缓存存储特定 URI 的响应的压缩版本和未压缩版本,并根据请求的 Accept-Encoding
值返回它们。 这是通过使用 Vary
响应头完成的,Vary
响应头是以逗号分隔的不同标头列表,这些标头的值会触发请求资源的不同表示形式
1
Vary: Accept-Encoding, User-Agent
提示
这个特定的 Vary
标头将根据 URI 以及 Accept-Encoding
和 User-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 许可证获得许可。