我读了http://code.google.com/speed/page-speed/docs/caching.html。它说代理服务器可以缓存cookie。我需要澄清。
假设我的文件有这个标题:Cache-Control "max-age=604800, public"
Q.1。使用此标头,当访问静态文件时,来自个人计算机的cookie是否会缓存在代理服务器上? (然后,下一个访问文件的人会拿起其他人的cookie吗?)
现在,让我们说缓存代码改为Cache-Control "max-age=7200, proxy-revalidate"
。 Q.2。代理服务器上的cookie缓存有什么区别?< / p>
现在我对实际设置 Cookie(例如Javascript或PHP)的文件有疑问。
Q.3。将Cookie缓存在代理服务器何时访问这些类型的文件?或者缓存与静态文件相同吗?
如果你想知道,我问这些事情的原因是因为我不一个人的cookie被代理缓存,因此被转移给另一个人。所以任何澄清都会有所帮助。非常感谢你!
修改:
非常感谢你的帮助。但我还需要进一步澄清。
如果我有使用标题Cache-Control "max-age=604800, public"
的文件,请求任何Cookie(Cookie
)或响应Cookie(Set-Cookie
)被转移到 另一个用户的计算机 (因为它在缓存中)?或者是否仅为个人用户浏览 缓存?如果设置为Cache-Control "max-age=7200, proxy-revalidate"
怎么办?再次感谢。
答案 0 :(得分:19)
这取决于代理和Vary
响应标头。通常,代理不会缓存对具有Cookie
标头的请求的响应。但是,这并不能保证。
当您使用指令Cache-Control
指定public
标头时,您要求代理在不同客户端之间共享缓存。这可能是不你的意图,所以你应该指定private
。请参阅:http://www.mnot.net/cache_docs/#CACHE-CONTROL
代理服务器上的cookie缓存有什么区别?
不是真的。它只是告诉代理它不应该从过时的缓存中提供服务。它不会影响缓存的控制方式。
访问这些类型的文件时,cookie是否会缓存在代理服务器上?或者缓存与静态文件相同吗?
对于http级别的软件(例如代理),静态和动态内容之间没有区别。 Cookie只是带有请求(Cookie
标头)发送的http标头,或带有响应(Set-Cookie
标头)
如果您在浏览器中设置cookie(通过Javascript或从服务器端,通过Set-Cookie
标头),浏览器将向后发送cookie,并将所有后续请求发送到同一域。它通过在请求中添加Cookie
标头来实现此目的。
修改强>
我确实希望将我的实际文件缓存在代理上,而不是单个用户的cookie。我该怎么做?
您需要避免缓存任何响应:
Set-Cookie
标头(因为这将由代理缓存)Cookie
标题的内容确定要呈现的内容(例如,打印“欢迎回来,John Doe”或其他自定义)你究竟要做到这一点取决于你的后端技术。您的应用程序知道Cookie
标头是否对响应有意义,或者响应是否可能包含Set-Cookie
标头。
在我使用的应用程序框架中,有一个用于设置cache-by-expires标头的函数。如果我在同一个请求中调用它并访问cookie,我将收到错误消息。这可以确保我不会不小心要求代理缓存私有内容。您需要在应用程序中实现类似的逻辑。
或者,您可以配置边缘级代理来执行相同的操作。如果您不完全控制应用程序,通常会这样做。
如果我有使用标题Cache-Control“max-age = 604800,public”的文件,任何请求cookie(Cookie)或响应cookie(Set-Cookie)都会被转移到另一个用户的计算机(因为它在缓存中) ?或者它是否仅针对该用户的浏览进行缓存?
请求Cookie不会被缓存,也不会在任何地方传输。响应(Set-Cookie
)已缓存。由于您将cache-control
指定为公共,因此将在所有客户端之间共享。请注意,即使请求cookie未直接缓存,如果您在页面中呈现某些内容,依赖于cookie(例如,如果您将cookie用于服务器端会话状态,例如身份验证),您将缓存个性化响应。
如果设置为Cache-Control“max-age = 7200,proxy-revalidate”怎么办?再次感谢。
同样的事情。 proxy-revalidate
通知任何代理(如果有的话)他们可能服务过时的缓存。例如。一旦7200秒过去,应立即清除缓存。如果没有这个,缓存通常会继续提供过时的缓存,然后在达到超时后在后台获取新的副本。或不 - 取决于代理。