【发布时间】:2010-12-31 05:14:30
【问题描述】:
我已经完成了一个可以为许多文档提供服务的小型 PHP 应用程序。这些文档必须可由客户端和代理缓存。
由于代理可以缓存我的结果,我必须格外小心,因为我服务的文档可以有不同的 MIME 类型(基于 $_SERVER['HTTP_ACCEPT'] 的内容协商)和不同的语言(基于此顺序:$_POST 值 / $_GET 值/URL/PHP 会话值/$_COOKIE 值/$_SERVER['HTTP_ACCEPT_LANGUAGE']/默认脚本值)。
简而言之,一个页面可以使用多种 MIME 类型和多种语言提供相同 URL(问题已更改:请参阅下面的编辑)。
为了帮助缓存代理,我将“Vary: Accept”标头结合与 ETag 标头结合使用。 ETags 是当前语言的 MD5 和最后修改的时间戳。
我总是:
- 发送过期标头
- 发送 Cache-Control 标头
- 发送 Last-Modified 标头
- 发送 Content-Type 标头
- 发送 ETag 标头(基于当前语言和 Last-Modified 时间戳)
- 发送内容语言
- 如果文档是 XHTML,则发送“Vary: Accept”标头
现在我的问题是:这足以帮助在代理和客户端上进行缓存吗?我错过了什么/标题吗?
为了帮助您,这里是测试页面的 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 和具有不同语言(可能来自这么多来源 - 见上文)的文档只是简单的糟糕设计。如果您想这样做,只需使用“私有”缓存(代理上没有缓存)...我正确吗?
如果每种语言都有自己的 URL(但每个 URL 仍然可以使用许多 MIME),我当前的实现是否适合“公共”缓存(客户端缓存 + 代理)?
【问题讨论】:
标签: php http caching proxy http-headers