htaccess - 如何强制客户端的浏览器清除缓存?

时间:2011-12-01 20:09:11

标签: .htaccess caching gzip

对于我的网站,我有以下htaccess规则:

# BEGIN Gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
# END Gzip

# BEGIN EXPIRES
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 10 days"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType text/plain "access plus 1 month"
    ExpiresByType image/gif "access plus 1 month"
    ExpiresByType image/png "access plus 1 month"
    ExpiresByType image/jpeg "access plus 1 month"
    ExpiresByType application/x-javascript "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
    ExpiresByType application/x-icon "access plus 1 year"
</IfModule>
# END EXPIRES

我刚刚更新了我的网站,看起来一切都搞砸了,直到我清理了我的缓存。如何在更新后强制客户端浏览器清除缓存,以便用户可以看到更改?

13 个答案:

答案 0 :(得分:104)

您可以强制浏览器缓存某些内容,但

您无法强制浏览器清除其缓存。

因此,唯一的(AMAIK)方式是为您的资源使用新网址。像版本控制一样。

答案 1 :(得分:53)

正如其他答案所说,更改网址是一种很好的缓存清除技术,但是通过更大的网站,更改所有网址以及移动文件都有很多工作要做。

类似的技术是只在URL字符串中添加一个版本参数,该字符串是随机字符串/数字或版本号,并且仅针对更改的文件。

例如,如果您更改站点CSS并且在执行强制刷新之前它看起来很糟糕,只需将?ver=1.1添加到文件头部的CSS导入中即可。这对浏览器来说是一个不同的文件,但您只需要更改导入,而不是文件的实际位置或名称。

e.g:

<link href="assets/css/style.css" rel="stylesheet" type="text/css" />

变为

<link href="assets/css/style.css?ver=1.1" rel="stylesheet" type="text/css" />

也非常适合javascript文件。

答案 2 :(得分:16)

我遇到了你的问题...

虽然我们可以完全清除客户端浏览器缓存,但您可以向应用程序添加一些代码,以便最近的更改反映到客户端浏览器。

<head>

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

来源:http://goo.gl/JojsO

答案 3 :(得分:5)

您无法强制浏览器清除缓存。

您的.html文件似乎会在10天后过期时重新加载。 您需要做的是更新.html文件并将所有文件移动到新文件夹(例如version-2/)或将附加版本标识符附加到每个文件,例如mypicture-2.jpg。然后在.html文件中引用这些新文件,浏览器将再次加载它们,因为位置已更改。

答案 4 :(得分:2)

您可以通过在标题中粘贴以下代码来告诉浏览器永远不会缓存您的网站

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

为了防止js,css缓存,你可以使用工具来缩小和混淆应该每次生成随机文件名的脚本。这会迫使浏览器从服务器重新加载它们。

希望这有帮助。

答案 5 :(得分:1)

您可以设置“访问加1秒”,这样下次用户进入网站时就会刷新。保持设置一个月。

答案 6 :(得分:1)

最直接的方法是向请求添加文件时间。 例如

myfile.txt的2014-10-30-13:12:33

按日期版本化。

答案 7 :(得分:1)

在我的情况下,我更改了很多特定的JS文件,我需要它在所有正在使用的浏览器中的最后一个版本。

我没有此文件的特定版本号,因此我只是哈希当前日期和时间(小时和分钟)并将其作为版本号传递:

<script src="/js/panel/app.js?v={{ substr(md5(date("Y-m-d_Hi")),10,18) }}"></script>

我需要每分钟加载一次,但您可以决定何时重新加载。

答案 8 :(得分:1)

现在,以下内容无法帮助您处理已经缓存的文件,但是继续前进,您可以使用以下内容轻松强制请求获取新内容,而无需更改实际文件名。

# Rewrite all requests for JS and CSS files to files of the same name, without
# any numbers in them. This lets the JS and CSS be force out of cache easily
# by putting a number at the end of the filename
# e.g. a request for static/js/site-52.js will get the file static/js/site.js instead.
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^static/(js|css)/([a-z]+)-([0-9]+)\.(js|css)$ /site/$1/$2.$4 [R=302,NC,L]
</IfModule>

当然,你的文件夹结构越高,你就采用这种方法, 通过简单的更改,你就可以从缓存中解脱出来。

例如,如果您将网站的整个css和javascript存储在一个主文件夹中

/assets/js
/assets/css
/assets/...

然后你可以开始引用它作为&#34; assets-XXX&#34;在您的HTML中,并使用这样的规则将所有资产内容从缓存中踢出。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^assets-([a-z0-9]+)/(.*) /$2 [R=302,NC,L]
</IfModule> 

请注意,如果您确实使用了它,那么在使用它之后,将302更改为301,然后缓存将启动。当它为302时,它将不会在浏览器级别缓存,因为它&#39 ; sa临时重定向。如果你这样做,那么你可以将所有资产的到期默认时间提高到30天,因为只需更改登录页面中的文件夹名称,就可以轻松地从缓存中解脱出来。

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault A2592000
</IfModule>

答案 9 :(得分:0)

更改.CSS文件的名称 加载页面,然后再以原始名称再次更改文件。

答案 10 :(得分:0)

这对我有用。

寻找这个:

    DirectoryIndex index.php

替换为:

    DirectoryIndex something.php index.php

上传和刷新页面。您会收到页面错误。

只需将其更改回:

    DirectoryIndex index.php

再次重新上传和刷新页面。
我在所有设备上都进行了检查,并且有效。

答案 11 :(得分:0)

使用R = 301的mod重写-使用增量版本号:

要实现> css / ver / file.css => css / file.css?v = ver

RewriteRule ^ css /([0-9] +)/ file.css $ css / file.css?v = $ 1 [R = 301,L,QSA]

例如css / 10 / file.css => css / file.css?v = 10

可以将相同的内容应用于js /文件。递增版本以强制更新,301强制重新缓存

我已经在Chrome,Firefox,Opera等上进行了测试

PS:?v = ver仅出于可读性,这不会引起刷新

答案 12 :(得分:0)

向 URL 添加“随机”数字对我来说似乎既不优雅又昂贵。它还破坏了页面的 URL,它可能看起来像 index.html?t=1614333283241,顺便说一句,用户将缓存数十个 URL,仅用于一次使用。
我认为这种事情是 .htaccess 文件旨在在服务器端解决您的功能代码和用户之间的问题。

我从 here 复制/粘贴此代码,该代码允许按文件扩展名进行过滤以强制浏览器不缓存它们。如果您想恢复正常行为,只需删除或评论即可。

在您想要防止缓存的每个文件夹上创建或编辑一个 .htaccess 文件,然后粘贴此代码更改文件扩展名以满足您的需要,甚至匹配一个单独的文件。
如果该文件已存在于您的主机上,请谨慎修改其中的内容。
(感谢链接)

# DISABLE CACHING
<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

<FilesMatch "\.(css|flv|gif|htm|html|ico|jpe|jpeg|jpg|js|mp3|mp4|png|pdf|swf|txt)$">
    <IfModule mod_expires.c>
        ExpiresActive Off
    </IfModule>
    <IfModule mod_headers.c>
        FileETag None
        Header unset ETag
        Header unset Pragma
        Header unset Cache-Control
        Header unset Last-Modified
        Header set Pragma "no-cache"
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
        Header set Expires "jue, 1 Jan 1970 00:00:00 GMT"
    </IfModule>
</FilesMatch>