我想弄清楚最好的HTTP标头发送四个用例。我希望拿出不依赖于用户代理/协议版本嗅探的头文件,但我会接受,如果没有其他适合。所有URL都通过完全自定义处理程序获取,因此我可以根据需要选择所有标题,这全部是关于中间代理和用户代理。如果可能的话,这应该与HTTP/1.0和HTTP/1.1客户端兼容。如果存在多种解决方案,通过电线发送时最好的解决方案将是最短的解决方案。HTTP头:控制缓存和历史机制
静态公共内容
所有“静态公共含量”的东西,HTTP的真正意义:如果URL是一样的,内容是一样的。我可以轻松地做到这一点:例如,我将用户配置文件图标放入http://domain.com/profiles/xyz/icon/1234abcd,其中“1234abcd”是图标文件内容的SHA-1。如果我将来更改为图标,我将创建一个新的URL并修改所有应该使用新图标的现有推荐人。什么是最好的头文件来声明这可能会永久缓存并可能被共享?我目前正在思考一些问题:
Date: <current time>
Expires: <current time + one year>
这是否足以允许用户代理和代理进行缓存?我需要Last-Modified
还是Pragma
?
静态非公开内容
所有“静态非公开内容”的东西,是静态的,但可能无法提供给大家。实际上,这些内容仅对选定的登录用户可用(会话保持会话cookie保持会话UUID)。如果URL相同,则内容相同。但是,回应并不公开。用例可以是社交网络服务中选定好友共享的图片。我目前在思考:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=<huge number>, s-maxage=0
这足以让用户代理缓存和禁用代理吗?我需要Pragma
吗?
挥发公开内容
所有“挥发性公开内容”的东西,易挥发,提供给大家。类似于http://slashdot.org/的首页,当未登录时。意图是允许快速更新不变URL中的内容。 请注意,我不想破坏用户代理历史机制(即,从易失性页面中单击某些内容,然后点击后退按钮不应导致从服务器获取易失性页面 - 但是,请单击一个链接去首页应该从服务器获取资源)。我目前正在思考:
Date: <current time>
Expires: <current time>
Cache-Control: public, max-age=0, s-maxage=0
这足以防止缓存但允许历史机制(后退按钮)?我知道,如果我发送Cache-Control: no-store, must-revalidate
我可以强制重新加载,但这不是我想要的,因为这也会打破后退按钮。我需要Last-Modified
还是Pragma
?
尽管这是公开的,但允许中间代理缓存此内容可能没有意义,因为它是不稳定的。
挥发性非公开内容
所有“挥发性非公开内容”的东西,易挥发,不提供给大家(私人)。类似于登录时的http://slashdot.org/的头版。意图是允许快速更新不变URL中的内容。 请注意,我不想破坏用户代理历史机制(即,从易失性页面中单击某些内容,然后点击后退按钮不应导致从服务器获取易失性页面 - 但是,请单击一个链接去首页应该从服务器获取资源)。我目前在思考:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=0, s-maxage=0
这足以防止缓存但允许历史机制(后退按钮)?我需要Pragma
吗?
的事情,还需要我的建议的首部测试:
- 验证私人内容将无法通过HTTP/1.0代理被泄露。
- 验证缓存在代理中是否正常工作。
- 确认缓存在用户代理中正常工作。
- 验证用户代理历史记录机制在用户代理(所有情况下)中工作。
- 验证在链接到易失性页面后,从服务器获取新鲜内容。
- 使用HTTPS而非HTTP验证所有结果。
我知道以前的类似问题在http://stackoverflow.com/questions/2970938/ideal-http-cache-control-headers-for-different-types-of-resources - 但是,这是缺少三个重要的难题:后退按钮行为,用户代理兼容性和HTTP/1.0代理支持。 –
另一个经常引用的来源http://www.mnot.net/cache_docs/也受到不处理现实世界的用户代理行为与后退按钮和HTTP/1.0代理支持。 –
这里有一篇关于缓存控制的文章:http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/ - 也缺少真实世界的后退按钮行为,用户代理兼容性和HTTP/1.0代理支持。 –