我的PHP脚本缓存(公共)是否友好?

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和最后修改的时间戳.

我总是:

  • 发送过期标头
  • 发送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
"
Run Code Online (Sandbox Code Playgroud)

编辑:好的我明白,在这种情况下,提供一个包含许多MIME 不同语言的文档(可能来自如此多的来源 - 见上文)只是简单的糟糕设计.如果你想这样做只需使用"私有"缓存(代理上没有缓存)......我是否正确?

如果每种语言都有自己的URL(但每个URL仍然可以提供许多MIME),那么我的当前实现是否可以用于"公共"缓存(客户端+代理上的缓存)?

Wim*_*Wim 3

由于您的输出还取决于代理无法知道的内容(例如会话数据),因此将(不可缓存的)重定向发送到实际内容不是更容易吗?这对于给定的 URL(带有参数)是固定的,因此会更容易更容易缓存。我知道这涉及额外的往返,但它可能不太容易出错,并且也会减少不完全理解/支持所有标头组合的代理的问题。

另外,我猜测,如果您有两个客户端通过相同的代理但使用不同的语言 cookie,则您当前的方法将为同一 URL 返回两个不同的 ETag,这将使代理每次看到该代理时都会更新其副本其他客户端。