【问题标题】:How do I set my web site to cache but still make sure the user has the most recent version?如何将我的网站设置为缓存但仍确保用户拥有最新版本?
【发布时间】:2015-09-26 04:30:04
【问题描述】:

我希望我的网站能够从缓存中受益,但该网站会经常更新。如何确保用户获得的是最新版本?

目前我的.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>

【问题讨论】:

    标签: apache .htaccess caching cache-control


    【解决方案1】:

    您可以将 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 将计算其过期时间为 --> [最后修改时间 ( 最后一次在服务器中修改资源的时间,在这种情况下为 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

    【讨论】:

    • 老兄,需要一些其他信息或澄清吗??
    • 您建议将过期时间设置为什么?
    • 任何超过 24 小时,然后根据您的预期。通常可以选择23:59:0005:59:00 作为时间部分.. 我相信您正处于构建网站的初始阶段,所以 24 小时可能会很好..
    • 哥们有什么新的,你做了什么??
    猜你喜欢
    • 2017-09-13
    • 2011-12-28
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多