适当的缓存标头,以确保PHP页面始终被重新获取

Proper cache headers to ensure PHP pages are always re-fetched

提问人:Fabrício Matté 提问时间:2/28/2014 最后编辑:CommunityFabrício Matté 更新时间:2/28/2014 访问量:168

问:

在花了 2 天时间阅读有关缓存标头的信息后,我仍然不确定什么是最佳组合,以确保始终从服务器重新获取具有动态内容的 PHP 页面。

我相信一个标头似乎就足够了,也许是一个带有过去值的标头,以确保与 HTTP 1.0 代理缓存的兼容性。Cache-Control: no-cacheExpires


普拉格玛

Pragma未指定为响应标头:

注意:由于实际上未指定“Pragma: no-cache”作为响应标头字段的含义,因此它不能在响应中提供“Cache-Control:no-cache”的可靠替代

响应中标头的行为是特定于实现的,我相信当标头已经包含以下内容时,它不会增加太多:Pragma

Cache-Control: no-cache 
Expires: Sat, 01 Jan 2000 00:00:00 GMT

Pragma: no-cache是非标准的,似乎完全没有必要。


缓存控制

标头接受许多值,所以这是我必须做的细分:Cache-Control

  • no-cache表示将资源视为过时资源,并在后续请求上重新验证(通过 /)。这意味着,所以我不需要那些标题。一些最近的浏览器甚至将 .If-Modified-SinceIf-None-Matchmax-age=0, must-revalidateno-cacheno-store
  • no-store主要与安全有关,以防止在计算机中存储包含敏感数据的响应。我不仅通常不需要它,而且它似乎也是完全多余的,因为响应带有标头(必须重新验证)并且没有验证方法(无/),使响应无法被任何缓存使用。因此,这似乎是完全多余的。Cache-Control: no-cacheLast-ModifiedETag
  • proxy-revalidate由于上述相同原因,似乎是多余的。
  • public/private似乎也是多余的,因为任何缓存机制都无法使用响应。
  • pre-check=0, post-check=0是特定于 IE 的值,我认为这也是不必要的。

上下文

我没有使用 SSL/HTTPS,所以据说出现的 IE8 错误不适用于这个问题。我也不在乎浏览器在按下后退/前进按钮时是否使用存储的副本或重新获取资源。Cache-Control: no-cache


问题

我上面的所有假设都正确吗?我忽略了什么吗?或者任何可能的改进?


引用

PHP Apache 缓存

评论


答:

1赞 user244343 2/28/2014 #1

我相信你的假设是正确的。我做过很多涉及动态数据的项目,我们只需要(HTTP/1.1 标头)。设置过去的日期也是涵盖 HTTP/1.0 用户代理的好做法。Cache-Control: no-cacheExpires:

也就是说,如果您想明确通知请求代理该页面与以前的访问绝对不同,则可能值得发送基于时间的标题。这样一来,任何以前获取的副本都将具有不同的副本,并且代理将知道现在发送的副本是新的。这将略微增加请求标头大小,因为请求将包含前一个(如果有)。Etag:EtagEtag

评论

0赞 Fabrício Matté 2/28/2014
有 HTTP/1.0 用户代理这样的东西吗?我四处寻找列表,但找不到任何东西。我假设 IE <= 5.5 时代。+1 对于反馈,我会把问题搁置一会儿,即使我相当肯定,这应该就足够了。Cache-Control: no-cache
0赞 2/28/2014
这个帖子。截至 2010 年,仍使用 HTTP/1.0。wget