跳到内容

HTTP 缓存过期

编辑此页

过期模型是两种缓存模型中最有效和最直接的模型,应尽可能使用。当响应通过过期时间进行缓存时,缓存会直接返回该响应,而不会访问应用程序,直到缓存的响应过期。

过期模型可以使用两个几乎相同的 HTTP 标头来实现:ExpiresCache-Control

你可以在同一个 Response 中同时使用验证和过期。由于过期优先于验证,你可以同时享受两者的优点。换句话说,通过同时使用过期和验证,你可以指示缓存提供缓存的内容,同时在一定的时间间隔(过期时间)后检查以验证内容是否仍然有效。

使用 Cache-Control 标头过期

大多数时候,你将使用 Cache-Control 标头,它用于指定许多不同的缓存指令

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(public: true, maxage: 600)]
public function index(): Response
{
    // ...
}

Cache-Control 标头将采用以下格式(它可能具有其他指令)

1
Cache-Control: public, max-age=600

注意

使用 setSharedMaxAge() 方法不等同于同时使用 setPublic()setMaxAge() 方法。根据 RFC 7234 的 提供陈旧响应 部分,s-maxage 设置(通过 setSharedMaxAge() 方法添加)禁止缓存在 stale-if-error 场景中使用陈旧响应。这就是为什么建议同时使用 publicmax-age 指令。

使用 Expires 标头过期

Cache-Control 标头的替代方案是 Expires。两者之间没有优势或劣势之分。

根据 HTTP 规范,“Expires 标头字段给出了响应被视为过期的日期/时间。” 可以使用 #[Cache] 属性的 expires 选项或 setExpires() Response 方法设置 Expires 标头

1
2
3
4
5
6
7
8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(expires: '+600 seconds')]
public function index(): Response
{
    // ...
}

生成的 HTTP 标头将如下所示

1
Expires: Thu, 01 Mar 2011 16:00:00 GMT

注意

expires 选项和 setExpires() 方法会自动将日期转换为 GMT 时区,这是规范要求的。

请注意,在 1.1 之前的 HTTP 版本中,原始服务器不需要发送 Date 标头。因此,缓存(例如浏览器)可能需要依赖本地时钟来评估 Expires 标头,从而使生存期计算容易受到时钟偏差的影响。Expires 标头的另一个限制是,规范指出“HTTP/1.1 服务器不应发送未来一年以上的 Expires 日期。”

注意

根据 RFC 7234 的 计算新鲜度生存期 部分,当定义了 Cache-Control 标头的 s-maxagemax-age 指令时,Expires 标头值将被忽略。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本