【问题标题】:Cache issue with firefox on a drupal sitedrupal 站点上的 Firefox 缓存问题
【发布时间】:2013-03-18 11:12:53
【问题描述】:

所以我遇到的问题是我对我的 drupal 网站上的一个 css 文件进行了更改。当我导航到我所定位的网站部分时,该更改会立即显示在 google chrome 上。当我在 Firefox 中导航到该站点的该部分时,它会显示我之前访问过的旧页面。当然,手动刷新 Firefox 可以解决此问题。

问题在于,当用户看到旧版本的页面时,他们可能不知道点击刷新按钮,并认为它已损坏。

所以基本上,有没有办法检查当前页面是否已被缓存并告诉Firefox在php中清除它,或者可能是更优雅的方法?

【问题讨论】:

    标签: firefox drupal caching


    【解决方案1】:

    不幸的是,您无法轻松辨别客户端是否缓存了来自 PHP 或任何服务器环境的页面。但是,您可以建议浏览器是否缓存以及缓存多长时间。这是通过设置 Cache-Control HTTP 标头(和朋友)来实现的。见this page。大多数人倾向于在未来指定长达几个小时的缓存,因此用户将看到不超过 2 小时的陈旧数据。我建议这样做,但您也可以指示浏览器有效地完全关闭缓存。无论如何,我认为最简单的解决方案是在您的 .htaccess 文件中设置这些标头。

    下面是一个时间限制为 2 小时的示例:

    # Cache CSS and JS files for up to 2 hours
    <FilesMatch "\.(css|js)$">
        <IfModule mod_headers.c>
            # Set Max-age to 7200 seconds (2 hours), revalidate after 2 hours (ask the server if the file's changed)
            Header set Cache-Control "max-age=7200, must-revalidate"
        </IfModule>
        FileETag MTime Size
    </FilesMatch>
    

    另一个选项是允许缓存,但强制客户端询问服务器是否对每个请求进行了任何更改。这不会有太大的好处,尤其是在提供许多 css 和 js 文件的页面上(通常是 Drupal 的情况),因为浏览器仍然必须为每个文件向服务器发出往返请求:

    # Only use cache if checking with the server results in a 304 (Not Modified)
    <FilesMatch "\.(css|js)$">
        <IfModule mod_headers.c>
            # Instruct the client and possibly proxies in front of the client to check for new versions every 0 seconds (always)
            Header set Cache-Control "max-age=0, public, must-revalidate, proxy-revalidate"
            # For older browsers
            Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT"
        </IfModule>
        FileETag MTime Size
    </FilesMatch>
    

    最后,您可以要求浏览器禁用缓存。除非您确定文件会非常频繁地更改,否则我不建议您这样做,因为页面加载时间会受到影响:

    # Disable caching
    <FilesMatch "\.(css|js)$">
        <IfModule mod_headers.c>
            Header set Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0"
            # For older browsers
            Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT"
        </IfModule>
        FileETag MTime Size
    </FilesMatch>
    

    【讨论】:

    • 这是我在 stackoverflow 上收到的最好的答案。我会在星期一第一件事尝试,谢谢!
    • 刚刚开始工作,但我注意到我必须刷新才能使 max-age 显示在标题中。我应该将 .htaccess 文件添加到 FilesMatch 吗?
    • 如果我理解你所说的正确,那就是应该发生的事情。您的浏览器将缓存 max-age 标头(和文件),并且在 max-age 时间结束之前不会与服务器重新检查。您之前没有设置 max-age,因此浏览器会无限期地缓存,并且在您清除缓存之前,您对 .htaccess 的更新不会反映。这是一个很长的说法:不用担心,你做对了!
    • 是的,你是对的,这是有道理的,但我找到了解决方法(我认为),那就是重新启动服务器,以便浏览器立即记录 htaccess 更改。令人惊讶的是,如果我计算正确的话,之前有一个 max-age 设置,大约是 2 周。可能是drupal默认值。感谢您的帮助!
    【解决方案2】:

    对于更简单(非drupal)的解决方案,您可以将样式元href 重命名为其他名称。例如。 style.css?vers=1.0 ... style.css?vers=1.1 ... style.css?vers=1.1a ...等

    对于 Drupal,点击 清除所有缓存 按钮将重命名您的样式表引用,如上所示。 (配置/开发/性能)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多