Ale*_*exV 5 php proxy caching http http-headers
我已经完成了一个可以提供许多文档的小型PHP应用程序.客户端和代理必须可以缓存这些文档.
由于代理可以缓存我的结果,我必须格外小心,因为我提供的文档可以有不同的MIME类型(基于$ _SERVER ['HTTP_ACCEPT']的内容协商)和不同的语言(基于以下顺序:$ _POST value/$ _GET value/URL/PHP会话值/ $ _COOKIE值/ $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] /默认脚本值).
简而言之,一个页面可以提供许多MIME类型和许多具有相同 URL的语言(问题已更改:请参阅下面的编辑).
为了帮助缓存代理,我使用"Vary:Accept"标头结合 ETag标头.ETags是当前语言的MD5和最后修改的时间戳.
我总是:
现在我的问题是:这足以帮助缓存代理和客户端吗?我错过了一个东西/标题吗?
为了帮助您,这是测试页面的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
"
Run Code Online (Sandbox Code Playgroud)
编辑:好的我明白,在这种情况下,提供一个包含许多MIME 和不同语言的文档(可能来自如此多的来源 - 见上文)只是简单的糟糕设计.如果你想这样做只需使用"私有"缓存(代理上没有缓存)......我是否正确?
如果每种语言都有自己的URL(但每个URL仍然可以提供许多MIME),那么我的当前实现是否可以用于"公共"缓存(客户端+代理上的缓存)?
由于您的输出还取决于代理无法知道的内容(例如会话数据),因此将(不可缓存的)重定向发送到实际内容不是更容易吗?这对于给定的 URL(带有参数)是固定的,因此会更容易更容易缓存。我知道这涉及额外的往返,但它可能不太容易出错,并且也会减少不完全理解/支持所有标头组合的代理的问题。
另外,我猜测,如果您有两个客户端通过相同的代理但使用不同的语言 cookie,则您当前的方法将为同一 URL 返回两个不同的 ETag,这将使代理每次看到该代理时都会更新其副本其他客户端。