【发布时间】:2021-07-05 00:49:57
【问题描述】:
tl;dr:Chrome 不会为 HTTPS 请求发送“If-None-Match”标头,而是为 HTTP 请求发送它。 Firefox 总是在 HTTPS 和 HTTP 中发送“If-None-Match”。
当我遇到 Chrome 的奇怪行为时,我正在尝试优化节点服务器的 cookie 管理。我将尝试描述它并与 Firefox 进行比较。
首先,这是我用来测试的 HTTP 节点服务器:
#!/usr/bin/env node
'use strict';
const express = require('express');
const cors = require('cors');
const compression = require('compression');
const pathUtils = require('path');
const fs = require('fs');
const http = require('http');
let app = express();
app.disable('x-powered-by');
app.use(function (req, res, next) {
res.set('Cache-control', 'no-cache');
console.log(req.headers);
next();
});
app.use(express.json({ limit: '50mb' }));
app.use(cors());
app.use(compression({}));
let server = http.createServer(app);
app.get('/api/test', (req, res) => {
res.status(200).send(fs.readFileSync(pathUtils.join(__dirname, 'dummy.txt')));
});
server.listen(1234);
还有客户端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
let test = fetch('http://localhost:1234/api/test', { mode: 'no-cors' })
.then((res) => {
return res.text();
})
.then((resText) => console.log(resText));
</script>
</body>
</html>
我使用标头“no-cache”来强制客户端重新验证响应。 如果我正确理解了缓存的工作原理,我希望客户端发送带有“If-None-Match”标头的请求,该标头具有上一个请求的电子标签,并且服务器以 304 代码响应。
这是我在 Firefox 中刷新页面时的结果(因此至少已经收到一个响应)。我嵌入了请求标头的服务器日志。 此处的标头“If-None-Match”是由客户端请求发送的,正如预期的那样。
现在用 Chrome 进行同样的测试:
好吧,这里 Chrome 显示了一个 200 响应代码,但在后台,它实际上是一个由服务器发送的 304 响应,这可以通过这个 Wireshark 捕获显示:
如您所见,Chrome 发送带有正确电子标签的“If-None-Match”标头,因此是 304 响应。
所以现在,让我们用 HTTPS 试试这个。在服务器代码中,我只是将require('http'); 替换为require('https') 并在createServer 选项中传递我的ssl 密钥(如here 所述)
首先,Firefox 的行为:
我已经包含了wireshark 捕获。如您所见,一切正常,Firefox 具有预期的行为。
现在让我们用 Chrome 看看同样的事情:
这是我的问题:如您所见,Chrome 未发送“If-None-Match”。因此,正如预期的那样,服务器返回了一个 200 响应,可以在 Wireshark 捕获中看到(我刷新了两次页面,这就是为什么有 2 次交换)。
有人知道为什么 Chrome 会有这种奇怪的行为吗?
【问题讨论】:
标签: google-chrome https cache-control