仅当客户端在请求中304 Not Modified
包含标头时才应发送标头。If-Modified-Since
我有一个 PHP 脚本,它总是生成相同的一致输出(它恰好是图像/png),具体取决于重写规则提供给它的选项。对于我的脚本,我假设 ANYIf-Modified-Since
反映了浏览器中的有效缓存数据,因此我的脚本包括:
// If they've got it, they should use it.
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strlen($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
header("HTTP/1.0 304 Not Modified");
exit;
}
如果您想对此更聪明,您可以解析变量并将其与对您的脚本重要的任何内容进行比较。您需要考虑如何在每次运行时动态生成内容的 PHP 脚本的上下文中检测内容是否已更改。
有关浏览器缓存如何在 PHP 中工作的更多信息,请查看PHP: header
.
cURL
您可以使用命令行测试此行为:
[ghoti@pc ~]$ curl -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Sat, 31 Dec 2011 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
200 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sL -w "%{http_code} %{url_effective}\\n" https://www.google.com/images/srpr/logo3w.png -o /dev/null
304 https://www.google.com/images/srpr/logo3w.png
[ghoti@pc ~]$
注意不同的日期。
如果您在 Chrome 认为没有发送足够的标头时遇到问题,您可以尝试复制其他流行网站以标头的方式提供的内容:
[ghoti@pc ~]$ curl -H"If-Modified-Since: Mon, 31 Dec 2012 00:00:00 GMT" -sLI https://www.google.com/images/srpr/logo3w.png
HTTP/1.1 304 Not Modified
Date: Wed, 05 Dec 2012 17:40:52 GMT
Expires: Thu, 13 Dec 2012 17:40:52 GMT
Age: 241012
Server: GFE/2.0
毫无疑问,Server:
可以忽略,但如果您包括其他三个,您可能会减少来自 Chrome 的投诉。不过,正如我所说,您将不得不提出您想要使用的标准来确定您认为动态生成的内容的“年龄”,因为 Apache 检测到的静态文件上的文件系统时间戳不再可用。