.htaccess 修改重写,将查询字符串添加到所有静态文件中,以进行缓存破坏

ekqde3dh  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(130)

我尝试在所有.js文件的末尾附加一个查询字符串,而实际上并没有进行代码更改。这样做的目的是,当静态文件发生更改时,它们将从服务器而该高速缓存中被拉取,这样我们就不会有任何过时的静态文件。
所以当我的网页上写着

<script type="text/javascript" src="file1.js">

我希望它能把

<script type="text/javascript" src="file1.js?v=1">

这可能吗?
到目前为止我已经:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^$ 
RewriteRule ^(.*)\.js$ /$1.js?v=1 [L,R]

但我觉得它并没有完全按照我的意愿...

q3aa0525

q3aa05251#

这说不通:如果缓存的资源有过期日期,浏览器将永远不会在第一时间发出请求。
更直接的方法是为JS文件设置适当的缓存规则,如下所述:How to prevent http file caching in Apache httpd (MAMP),根据您的喜好调整filesMatch指示词。

vc6uscn9

vc6uscn92#

这将使对文件(在本例中为所有.js文件)的请求数加倍,但在其他情况下也应该如此。
我使用目录(有效地修改文件名),而不是查询字符串,因为这是首选技术。[ 1 ][2]
首先,重定向到其他文件夹名称

ReWriteRule ^(.*\.js)$ /rev/000/$1 [L,R]

用您的修订号替换000部分(您应该能够自动执行此操作)
L标志停止处理重写,R执行HTTP重定向,使用新文件名向服务器发起第二个请求。
然后捕获使用新“文件夹”标记的请求,并使用不调用另一个请求的重写规则将它们指向原始文件(此时将忽略第一个规则)

ReWriteRule ^/rev/[0-9]+/(.*)$ $1
syqv5f0l

syqv5f0l3#

好吧,我知道这个问题是旧的,但在寻找类似的东西时,我发现了两个聪明的Apache插件:
mod_pagespeed
这个东西重写了你正在服务的html页面,并用修改过的链接替换引用的静态资源链接(CSS,JS,img)。当磁盘上的静态资源改变时,插件会为它生成一个全新的url。我猜其中包含了一些基于内容的哈希。这会该高速缓存,因为客户端将不得不发出一个新的请求。
所以原始html页面的缓存时间应该是相当短的,但是所有相关的静态资源都可以缓存极长的时间。
mod_proxy_html
这个也可以在运行中编辑html。但它要简单得多,只提供重写链接,没有缩小和其他花哨的东西,就像mod_pagespeed一样。但有时这就是你所需要的,因为这可能意味着页面被重写破坏的风险较小。

相关问题