如何将我的网站设置为缓存,但仍确保用户具有最新版本?

时间:2015-09-25 13:24:15

标签: apache .htaccess caching cache-control

我希望我的网站受益于缓存,但网站经常更新。如何确保用户获得最新版本?

目前我的.htaccess文件如下所示:

<IfModule mod_expires.c>
# Enable expirations
ExpiresActive On 
# Default directive
ExpiresDefault "access plus 1 month"
# My favicon
ExpiresByType image/x-icon "access plus 1 year"
# Images
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 month"
# Javascript
ExpiresByType application/javascript "access plus 1 year"
</IfModule>

1 个答案:

答案 0 :(得分:0)

您可以将base用作您预期经常更改的应用资源的“修改”,并根据您的预期提供访问时间。以下是“修改”的工作原理:

假设您预计每天都会修改您的CSS文件,那么您可以使用ExpiresByType text/css "modification plus 1 day"然后就会发生这种情况(考虑到您在25-09-2015, 23:55上传了CSS文件):

  • 客户端在25-09-2015, 23:56上访问您的网页并下载所有CSS文件。现在,由于Apache在响应头中发送最后修改时间,因此客户端肯定会获得Last-Modified:Fri, 25 Sep 2015 23:55:00 GMT,因为您使用ExpiresByType指令和“修改”基础,所以Apache将其到期时间计算为 - &gt; [上次修改时间(上次在服务器中修改资源的时间,在本例中为2015年9月25日23:55 )+用“修改”基础指定的时间(在这种情况下,, 1天)],因此到期日期将计算为26 Sep 2015 23:55,因此Apache将发送Expires: Sat, 26 Sep 2015 23:55:00 GMT。因此,Apache将发送给客户端的2个缓存相关响应头将是:

    Last-Modified:Fri, 25 Sep 2015 23:55:00 GMT
    Expires: Sat, 26 Sep 2015 23:55:00 GMT
    
  • 现在,让我们说客户再次访问26 Sep 2015 03:55上的页面,然后它会看到该文档未过期,因此将使用该文档的缓存版本。这将按照您的预期进行。

  • 现在,让我们说客户再次访问26 Sep 2015 23:56上的页面,然后它会看到该文档已过期,因此会向服务器发送新文档的请求。

因此,现在客户端每次发现文档已过期时都会向服务器发送请求。当您进行全新上传时,Apache将重新计算到期时间,并在Expires响应标头中发送相同内容。

您可以查看answer of this question,这非常好。

对于您不希望经常修改的资源,您可以继续使用“访问”作为基础,就像您已经正确地为Favicon做的那样,一年内不会发生变化。

<小时/>

不幸的是Apache无法完全解决这个问题 - “只有在服务器上提供修改后的版本才能从服务器获取新文档,否则继续使用缓存文档”因为直到请求发送到服务器,客户端无法真正实现知道文件是否已经改变。或者,PUSH技术需要在服务器根据它推送一些信息和客户端行为的情况下实现。

其他一些信息:
HTML5提供了一项名为app-cache / offline-cache的功能,可以启用离线导航it is regarded as broken and will be dis-continued。如果您希望实现用户离线体验,可以查看Service worker