所以我遇到的问题是我做了更改,让我们在drupal网站上说一个css文件。当我导航到我定位的网站部分时,该更改会立即显示在Google Chrome上。当我在firefox中导航到该网站的那一部分时,它会显示我之前访问过的旧页面。当然手动刷新firefox可以解决这个问题。
问题在于,当用户看到旧版本的页面时,他们可能不知道点击刷新按钮,并认为它已损坏。
所以基本上,有没有办法检查当前页面是否已被缓存并告诉firefox在php中清除它,或者更优雅的方法?
答案 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点击清除所有缓存按钮,将重命名您的样式表引用,如上所示。 (配置/显影/性能)