【问题标题】:Asking Chrome to bypass local cache for XmlHttpRequest like it's possible in Firefox?要求 Chrome 绕过 XmlHttpRequest 的本地缓存,就像在 Firefox 中一样?
【发布时间】:2026-02-15 18:50:01
【问题描述】:

你们中的一些人可能已经知道,对于由 XmlHttpRequest 对象发起的请求,Firefox/Chrome 中存在一些缓存问题。这些问题意味着浏览器没有严格遵守规则,也没有去服务器获取新的 XSLT 文件(例如)。响应没有 Expires 标头(出于性能原因,我们不能使用它)。

Firefox 在 XHR 对象“通道”中有附加参数,您将值 Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE 放入其中以显式访问服务器。

Chrome 有类似的东西吗?

让我立即阻止所有建议将时间戳添加为 GET 参数或随机整数值的人 - 我不希望服务器获得不同的 URL 请求。我希望它获取原始 URL。原因是我想保护服务器不会收到太多对简单静态文件的不同请求,并在不需要时向客户端发送太多数据。

如果您使用生成的 GET 参数(如 '?forcenew=12314')点击静态文件,则每次第一次会呈现 200 个响应,并且对于该随机整数值的每个后续请求会呈现 304 个响应。如果目标静态文件与客户端版本相同,我想发出始终返回 304 的请求。这是顺便说一句,Web 浏览器应该如何开箱即用,但 XHR 对象往往根本不去服务器询问文件是否更改。

【问题讨论】:

    标签: ajax caching google-chrome xmlhttprequest


    【解决方案1】:

    在我的主要工作项目中,我遇到了同样的问题。我的解决方案不是将随机字符串或时间戳附加到 GET 请求,而是将 特定 字符串附加到 GET 请求。

    如果您有修订号,例如subversion 修订版或同样来自 git/mer 或您正在使用的任何东西,附加它。在发布新版本之前,静态文件将获得 304 响应。当新版本发生时,将授予单个 200 响应,然后它又会愉快地生成 304 响应。 :-)

    这具有独立于浏览器的额外好处。

    如果你运气不好,没有修订号,那就补一个,每次发布时增加一个。

    【讨论】:

    • 我想等待这个赏金的结束来说明我们如何解决它,因为我不希望任何人受到我们的解决方案的影响。我们完全按照您的建议进行了操作 :) 在我们执行网站“重新发布”的那一刻,我们生成带有该时刻时间戳的 GET。我真的没有其他办法......
    • 时间戳很好——在工作中我们一直在讨论从 subversion 到 git,我一直担心 git 没有修订号。也许我们也应该使用时间戳。 :-)
    【解决方案2】:

    您应该查看Etags,etags 是可以从文件内容生成的密钥,因此一旦服务器上的文件发生更改,系统将是一个新的 etag。显然,这将是一个服务端更改,如果您想要一个 200 和随后的 304,您将需要这样做。 Chrome 和 FF 应该尊重这些 etag,因此您不需要做任何疯狂的客户端黑客攻击。

    【讨论】:

    • 我理解你的想法。此时我们已经将 Etags 发送到浏览器。问题是当请求通过 XHR 对象路由时,Firefox/Chrome 决定在这些情况下根本不去服务器。问题是在这些情况下如何使浏览器转到服务器(绕过本地浏览器缓存)。
    【解决方案3】:

    Chrome 现在支持 Cache-Control: max-age=0 请求 HTTP 标头。开启XMLHttpRequest实例后即可设置:

    xhr.setRequestHeader( "Cache-Control", "max-age=0" );
    

    这将指示 Chrome 在没有重新验证的情况下不使用缓存的响应。

    如需更多信息,请查看 Mark Nottingham 的 The State of Browser Caching, RevisitedRFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching

    【讨论】:

    • 仅供参考,在 COR 请求的情况下,添加像上面这样的标头,将进行预检 OPTIONS 调用。
    最近更新 更多