【问题标题】:Nodejs express app not sending last-modified/exires header through HTTPSNodejs express 应用程序未通过 HTTPS 发送 last-modified/exires 标头
【发布时间】:2020-07-24 12:03:27
【问题描述】:

我通过谷歌云的应用引擎部署了一个 node-express 后端应用。

我正在通过它提供一些文件,并且我正在尝试将缓存正确设置为典型访问加上 1 周,但将最后修改添加到文件实际修改中以让浏览器知道它必须重新下载它.. .

这是我设置标题的方式

res.set({
    'Content-disposition' : 'inline',
    'Content-Type' : type,
    'Cache-Control' : 'public, max-age=604800, s-maxage=604800',
    'expires' : new Date(updated).toUTCString(),
    'Last-Modified' : new Date(updated).toUTCString()
})

当我尝试通过任何浏览器或邮递员访问资源时,我总是得到错误的 Last-Modified

发送的日期似乎是创建日期,所以我调试以检查“更新”是否正确。

在尝试调试一些不同的东西时,我发现了一些奇怪的东西...... 它可以通过 http 正常工作,但不能通过 https...

发生了什么?

Express 通过纯 http 提供服务,因为它只能在 GAE docker 内访问... 因此,它一定是一些奇怪的 GAE 问题,或者是我不知道浏览器如何处理缓存的问题? (但话又说回来,即使邮递员的行为也一样)

编辑: 来自不同设备的更多测试揭示了另一个提示,它不仅仅是 Last-Modified,它是整个标题.. 我通过 https 访问它只是完全跳过整个标头并获取最后一个请求标头,将状态变为 304,直到 max-age 过期

清除缓存也适用于 http,但不适用于 https

【问题讨论】:

  • 您使用的是 GAE Standard 还是 Flex?

标签: node.js typescript express google-app-engine caching


【解决方案1】:

这似乎是设计上的标准行为,因为所有时间戳在应用引擎部署时均为零。看: https://issuetracker.google.com/issues/168399701

我通过不设置 etag 和 last-modified 标头解决了这个问题。例如:

app.use("/", express.static(root, { etag: false, lastModified: false }));

或者对于单个文件:

app.get("/*", async (req, res) => {
  return res.sendFile("index.html", { root, lastModified: false, etag: false });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 2018-11-08
    相关资源
    最近更新 更多