Apache mod_expires

我对整个访问和修改感到困惑。

我想要文件被caching,直到它们被修改。 如果数据相同,则显示caching版本。 如果数据已更改,请下载更新的版本并将其caching。

我不明白为什么你会想要任何不同的东西? 所有这些访问加上6个月对我来说是没有意义的。 如果上次修改date比cachingdate更新,则请求新文件。 难道这不是这么简单吗?

我希望能够在2012年1月1日创buildindex.html并让每个人都caching它。 我不希望它被再次下载,直到我编辑它。 假设我在2012年1月5日进行了编辑,并且自2012年1月1日以来没有看到过index.html的用户,他们应该会看到他们有2012年1月1日的caching,但是现在该文件的最后一次修改时间为2012年1月5日,所以他们下载2012年1月5日版本并caching它。

我从来不想编辑一些东西,让用户在任何时间都看不到它。 我希望在下次请求时查看我所有的编辑内容。

我怎样才能做到这一切的所有文件?

不要做任何事情。 Apache已经具备了您期望的行为。

当浏览器请求已经看到并caching的URL,并且用户没有明确强制重新加载时,它将包含带有前一个请求的时间戳的If-Modified-Since标头。 如果服务器确定自从If-Modified-Since时间戳以来资产没有改变,则它仅响应304 Not Modified 。 (除时间戳之外,还有另外一个名为ETag头文件,用于检查caching有效性,通过比较内容的哈希值来工作,但是这不会增加讨论的任何内容。)

唯一一次你想使用任何mod_expires特性是当你想告诉浏览器不要打扰做一个HTTP请求来检查caching的资产是否是最新的一段时间。 例如,你可以有一个scheme,你的CSS文件位于/style.1.css ,并将其后续版本命名为/style.2.css等。在这种情况下,您可以通过设置一个Expires头来完全保存HTTP请求的开销。

这里有两个概念:caching和带宽节省。 对于你的用例,我会忘记Expires:但是我会在之后解释它。

如果您从文件夹提供物理文件,则Web服务器将添加一个或两个标头:

  • ETag: xyzzas4324@asdad/33 :它作为该文件版本的ID,并在文件内容改变时改变; 和/或
  • Last-Modified: <date> :与文件属性相同的修改date。

所以下一次,浏览器会询问http:// $ URL / file,

  • If-None-Match: xyzzas4324@asdad/33 ; 和/或
  • If-Modified-Since: <same date>

如果文件没有被改变,服务器发回一个304 Not Modified ,它向浏览器发出信号,表明它应该显示caching的版本。

注意:这避免了只重复传输该特定文件; 浏览器仍然需要等待Web服务器的回答。 所以还是有一些延迟

这是Expires来源。想象一下,请求的文件是一个RSS提要。 如果Expires: <2 hours from now>标题,则在该时间间隔期间,该浏览器不会重复该请求。 没有浏览器延迟等待服务器,没有增加负载。

有一本书更详细:构build可伸缩的网站。 有关这些技巧的更多细节,但我会给你快速破败:

这是你应该如何从旧的标志更改为新的,假设你已经设置了整个assets/* Expires: <6 years> assets/*

index.html v1:

 <h1>Welcome to Example Inc!</h1> <img src="assets/logo_v1.jpg"> 

index.html v2:

 <h1>Welcome to Example Inc!</h1> <img src="assets/logo_v2.jpg"> 

注意index.html 没有 Expires: <6 years> 。 它得到了304 Not Modified治疗。 当您更改其中一个资产时,您将增加其版本号并更改其使用的.html文件。

而且你得到两全其美。

你所描述的是任何现代的networking服务器默认的工作方式。

如果用户每次请求页面/资源(asset = js,css,images等)时都不发送显式的caching/过期头文件(或者发送etag头文件),浏览器会向服务器发送请求。 根据你的描述,这是你想要的行为 – 你希望浏览器总是请求页面/资产,并接收更新的内容或304 Not Modified空响应,表明用户以前caching的是最新版本。

因此,你想要做的是删除你自己添加的所有头文件,以便Apache(仅)修改头文件。

至于为什么你会想要一个不同的行为:

以上内容适用于html页面 – 但对于内容types变化很less或内容变化时只需更改url的内容而言效率低下。 发送一个请求到你的服务器,并收到一个304 Not Modified响应是不是免费的 – 这需要时间(取决于页面上有多less资产 – 这可能是很多时间),并在服务器上产生负载(是的,处理大量的静态资源请求会严重影响服务器的性能),所以对用户不利,对您不利。 这就是为什么你想添加长期过期的头文件,并尽可能使用caching清除 ,以尽可能减lesshttp请求,但强制用户在更改时重新下载资源。

html5boilerplate项目中有一个很好的.htaccess指南 。 详细介绍了如何优化(caching)标题以提高性能和用户体验。 你不需要陷入细节:只要将默认的.htaccess放在你的文档根目录下,并检查它是否符合你的期望。 默认的configuration应该做你想要的东西,为静态资产添加最佳实践caching标题。 如果你的问题实际上并不是关于HTML内容,而是另一种内容types的话,那么在简单地禁用.htaccess文件中的caching逻辑为你做的所有好的工作之前,请先阅读引用;)