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


74

对于我的网站,我具有以下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

我刚刚更新了我的网站,直到清除缓存之前,它看起来都很混乱。如何在更新后强制客户端的浏览器清除缓存,以便用户可以看到更改?



6
您需要将URL更改为资源。例如,通过重命名包含资源的文件夹或文件名本身。谷歌cache busting获取更多信息。
Gerben

在这里您可以找到更好的解决方案:stackoverflow.com/questions/118884/…–路
卡·莫里·波尔佩蒂尼

Answers:


113

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

您不能强制浏览器清除其缓存。

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


3
对。就是这个 您甚至在htaccess中说,“甚至不用花10天时间就联系服务器”。
塔索斯·巴索科斯

缓存的URL是否与服务器联系以进行更改,或者即使在完全脱机的情况下加载URL时也根本不连接服务器?
diti

1
这个答案有点过时了。这仍然是真实的陈述吗?
克雷格·伦敦

4
@CraigLondon-这是措辞问题……这仍然是事实;:但是,你可以强制刷新浏览器上的负载为您的网站的缓存如下所示 stackoverflow.com/questions/5721704/...
马特·杰克逊

1
@ dustytrash,AMAIK =据我所知
Saeed Neamati

64

就像其他答案所说的那样,更改URL是一种很好的缓存清除技术,但是要遍历更大的站点,更改所有URL并移动文件也是很多工作。

一种类似的技术是仅向URL字符串添加一个版本参数,该参数可以是随机字符串/数字或版本号,并且仅定位更改的文件。

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

例如:

<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
简单,容易和最有效的部分。在htaccess之前尝试过,但根本没用...
HC

尽管已接受的答案说明了这一点,但此答案提供了更多信息。我认为这应该是公认的答案。
Jh62

?ver = 1.1 / 1.2 / 1.3等不适用于许多浏览器
Ian 2010年

@Ian您能详细说明吗?如果在所有情况下都无法解决问题,我想更新答案。
totallyNotLizards 20-10-20

@totallyNotLizards我使用了相同的方法,直到我意识到某些浏览器(特别是Chrome)无法将更改的参数识别为其他文件位置。因此,我实现了下面提到的htaccess方法。
伊恩

18

我有你的问题...

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

在您的<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


5

您不能强制浏览器清除缓存。

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


3

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

<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缓存,您可以使用工具来缩小和混淆脚本,这些脚本应每次生成一个随机文件名。那将迫使浏览器也从服务器重新加载它们。

希望有帮助。


2
Stackoverflow的优点在于提供了可能
无法解决

这对我有用。删除文件后,WordPress会继续下载index.php文件。在我的htaccess文件中使用这些标头修复了该文件
Milestewart88 '20

3

就我而言,我更改了一个特定的JS文件,我需要在所有正在使用的浏览器中将其保留为最新版本。

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

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

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


1

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


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/...

然后,您可以开始在html中将其引用为“ assets-XXX”,并使用类似的规则将所有资产内容踢出缓存。

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

请注意,如果确实要这样做,则在将其工作之后,将302更改为301,然后将开始进行缓存。当它为302时,由于它是临时重定向,因此不会在浏览器级别进行缓存。如果您采用这种方式,则可以将所有资产的默认过期时间延长至30天,因为您只需更改登录页面中的文件夹名称即可轻松将其退出缓存。

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

0

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

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

按日期进行版本控制。



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仅出于可读性,这不会导致刷新


-1

这对我有用。

寻找这个:

    DirectoryIndex index.php

替换为:

    DirectoryIndex something.php index.php

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

只需将其更改回:

    DirectoryIndex index.php

重新上传并刷新页面。
我在所有设备上都检查了一下,结果正常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.