我正在尝试对标签使用 data-lift="with-resource-id" 参数,如 Lift Cookbook ( http://cookbook.liftweb.net/#AvoidAssetCaching ) 中所述,以避免浏览器中的资产缓存。我复制了说明书中提供的代码示例并将其修改为我的环境,以便将随机值引入参数路径。
我的资产存储在两个根目录中——一个名为“css”,一个名为“js”,分别用于 css 和 javascript。
我的代码如下所示:
import net.liftweb.http._
import net.liftweb.util._
object AssetCacheBuster {
def init() : Unit = {
val resourceId = Helpers.nextFuncName
LiftRules.attachResourceId = (path: String) => {
val PathRegex = """\/cached(\/css\/|\/js\/)(\S+)""".r
try {
val PathRegex(root, rest) = path
"/cached" + root + resourceId + "/" + rest
} catch {
case e: scala.MatchError => path
}
}
// Remove the cache/{resourceId} from the request if there is one
LiftRules.statelessRewrite.prepend( NamedPF("BrowserCacheAssist") {
case RewriteRequest(ParsePath("cached" :: "css" :: id :: file :: Nil, suffix, _, _), _, _) =>
RewriteResponse("css" :: file :: Nil, suffix)
case RewriteRequest(ParsePath("js" :: id :: file :: Nil, suffix, _, _), _, _) =>
RewriteResponse("js" :: file :: Nil, suffix)
})
}
}
例如,我通过如下调用嵌入了 css 文件:
<link data-lift="with-resource-id" rel="stylesheet" type="text/css" href="/cached/css/standard.css" />
我期望它的工作方式是 attachResourceId 逻辑将通过路径“/cached/css”识别嵌入的css文件并在路径中注入一个唯一值。因此,例如,/cached/css/standard.css 变为 /cached/css/F7017951738702RYSX0/standard.css。通过使用 Chrome 检查元素,我可以看到这确实发生了,所以我相信这按预期工作。
在底部的重写逻辑中,我希望它查找以“/cached/css”开头的请求并删除/cached 和唯一id 组件。通过在调试器中进行跟踪,这似乎也有效。在调试器中,我可以看到它试图重写的结果 url 是“/css/standard.css”。而且我可以验证,如果我在浏览器 URL 中输入此值,该内容确实会得到服务。然而,浏览器显示一个错误(我可以通过 Chrome 的控制台看到)找不到 .css 文件。