我写了一个简单的Express node.js服务器来测试一些HTTP缓存的东西。
const express = require('express')
const serveStatic = require('serve-static')
const path = require('path')
const app = express()
app.use(serveStatic('build', {
extensions: ['html'],
setHeaders(res, path) {
res.setHeader('Cache-Control', `max-age=10`)
}
}))
app.get('*', function (request, response) {
response.sendFile(path.resolve(__dirname, 'build/200.html'))
});
const port = process.env.PORT || 3001
app.listen(port, () => console.log(`Listening on port ${port}`))
有趣的是,如果没有我明确地在res.setHeader
中添加ETAG,似乎响应会自动附带一个弱ETAG,比如ETag: W/"45b4e-181a6ae36a4"
。但是,如果我自己显式设置ETAG,例如res.setHeader('ETAG', md5(...))
,则不会发生弱ETAG。
我想知道weak-etag是从哪里来的,它是如何影响缓存无效的。如果我自己显式设置ETAG,它的行为会一样吗?
这里有一个类似的问题,但答案似乎不适用于我的情况。
res.sendFile
和res.send
,在它的基础上,生成他们自己的ETag,除非一个ETag头已经设置。看到https://github.com/expressjs/express/blob/158a17031a2668269aedb31ea07b58d6b700272b/lib/response.js L178-L180
默认的ETag函数是"weak"。看到https://github.com/expressjs/express/blob/158a17031a2668269aedb31ea07b58d6b700272b/lib/application.js L80-L86
客户端将etag视为"不透明的":当读取资源时,它们在ETag
头中从服务器接收,并在随后的请求中发送回服务器
- 资源更新时
If-Match
报头中的 当资源被缓存并重新验证时, - 。
If-Match-None
头中的这取决于服务器实现ETag是否匹配,因此,是否可以更新资源或使用缓存的资源。服务器还决定是否发送一个弱或强ETag的。