0

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

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

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

4

2 回答 2

2

不幸的是,您无法轻易辨别客户端是否缓存了来自 PHP 或任何服务器环境的页面。但是,您可以建议浏览器是否缓存以及缓存多长时间。这是通过设置 Cache-Control HTTP 标头(和朋友)来实现的。请参阅此页面。大多数人倾向于将缓存指定为未来几个小时,因此用户将看到不超过 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>
于 2012-07-21T01:27:30.000 回答
0

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

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

于 2013-03-18T02:54:49.380 回答