所以我遇到的问题是我对我的drupal网站上的一个css文件进行了更改。当我导航到我所定位的网站部分时,该更改会立即显示在 google chrome 上。当我在 Firefox 中导航到该站点的该部分时,它会显示我之前访问过的旧页面。当然,手动刷新 Firefox 可以解决此问题。
问题在于,当用户看到旧版本的页面时,他们可能不知道点击刷新按钮,并认为它已损坏。
所以基本上,有没有办法检查当前页面是否已被缓存并告诉firefox在php中清除它,或者可能是更优雅的方法?
不幸的是,您无法轻易辨别客户端是否缓存了来自 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>
对于更简单的(非 drupal)解决方案,您可以将样式 meta href 重命名为其他内容。例如。 style.css?vers=1.0 ... style.css?vers=1.1 ... style.css?vers=1.1a ...等
对于 Drupal,点击清除所有缓存按钮将重命名您的样式表引用,如上所示。(配置/开发/性能)