我已经完成了一个可以提供许多文档的小型 PHP 应用程序。这些文件must可由客户端缓存and代理。
由于代理可以缓存我的结果,因此我必须格外小心,因为我提供的文档可以具有不同的 MIME 类型(基于 $_SERVER['HTTP_ACCEPT'] 的内容协商)和不同的语言(按此顺序:$_POST 值 / $_GET 值/ URL / PHP 会话值 / $_COOKIE 值 / $_SERVER['HTTP_ACCEPT_LANGUAGE'] / 默认脚本值)。
简而言之,一个页面可以提供多种 MIME 类型and许多语言与sameURL(问题已更改:请参阅下面的编辑)。
为了帮助缓存代理,我使用“Vary: Accept”标头结合与 ETag 标头。 ETag 是当前语言和最后修改时间戳的 MD5。
我总是:
- 发送 Expires 标头
- 发送 Cache-Control 标头
- 发送 Last-Modified 标头
- 发送 Content-Type 标头
- 发送 ETag 标头(基于当前语言和 Last-Modified 时间戳)
- 发送内容语言
- 如果文档是 XHTML,则发送“Vary: Accept”标头
现在我的问题是:这是否足以帮助缓存代理and客户?我错过了什么/标题吗?
为了帮助您,这里是测试页面的 HTTP 响应标头(在我的本地环境中):
"
Date Wed, 30 Dec 2009 18:56:26 GMT
Server Apache/2.0.63 (Win32) PHP/5.1.0
X-Powered-By PHP/5.1.0
Set-Cookie Tests=697daqbmple2e1daq2dg74ur96; path=/
Expires Wed, 30 Dec 2009 21:56:26 GMT
Cache-Control public, max-age=10800
Last-Modified Mon, 28 Dec 2009 15:11:49 GMT
Etag "44fa50be4638161a596e4b75d6ab7a94"
Vary Accept
Content-Language en-us
Content-Length 3043
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type application/xhtml+xml; charset=UTF-8
"
编辑:好的,我明白在这种情况下提供具有许多 MIME 的文档and使用不同的语言(可以来自很多来源 - 见上文)只是简单的糟糕设计。如果你想这样做,只需使用“私有”缓存(代理上没有缓存)......我对吗?
如果每种语言都有自己的 URL(但每个 URL 仍然可以提供许多 MIME),那么我当前的实现对于“公共”缓存(客户端 + 代理上的缓存)是否可以?