在drupal站点上使用firefox缓存问题

时间:2012-07-20 23:45:23

标签: firefox drupal caching

所以我遇到的问题是我做了更改,让我们在drupal网站上说一个css文件。当我导航到我定位的网站部分时,该更改会立即显示在Google Chrome上。当我在firefox中导航到该网站的那一部分时,它会显示我之前访问过的旧页面。当然手动刷新firefox可以解决这个问题。

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

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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