这个问题仅出现在 Chrome 和 Edge , 也给 chromium 官方提了 Bug 不知道会不会确认是个 BUG 。
1.server code
const express = require('express');
const cors = require('cors');
const app = express();
const port = 3000;
app.use(cors({
origin: '*',
allowedHeaders: ['If-None-Match', 'If-Modified-Since'],
exposedHeaders: ['ETag', 'Last-Modified', 'Cache-Control'],
maxAge: 86400,
}));
app.get('/getcache', (req, res) => {
if (req.header('If-None-Match')) {
return res.status(304).end();
}
const time = Date.now();
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('ETag', time);
res.send(JSON.stringify({ time }));
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
2.client code
fetch('http://localhost:3000/getcache');
在其他网页(跨域)的控制台执行上面 fetch 请求即可,第二次请求后内容没变化但是状态码一直是 200 。用代理软件抓包发现服务端实际响应的是 304 ,在 Safrai 或者 Postman 中请求也是 304 。
如果不是跨域请求,在同域请求 Chrome 是能正常显示 304 状态。
不明白 chrome 会修改这个状态,实际不管是同域还是跨域都支持了协商缓存,状态码为啥要修改成 200 ?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.