Safari 并不总是发送 If-None-Match 来获取页面加载

问题描述 投票:0回答:1

我有一个模拟项目,正在测试不同浏览器上的

Etag
If-None-Match
行为。页面加载时发送
Get
请求,我将始终使用
200
进行响应并分配新的
Etag
值。

window.addEventListener('load', () => getEtag(false));

function getEtag() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            console.log("Success");
        }
    };

    xhr.onerror = function () {
        console.log("Failure");
    };

    xhr.open("Get", "http://localhost:8080/etag", true);
    xhr.send();
}

Java 服务器端:

   @GetMapping("/etag")
    public String getEtag(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("ETag", UUID.randomUUID());
        return "";
    }

我知道这不是

Etags
的预期用途,但请耐心等待。在 Chrome 和 Firefox 上,这可以按预期工作。在每个页面加载时,请求都包含
If-None-Match
标头。然而,在 Safari 上,标头仅包含在所有其他请求中。我知道有几个关于
Etags
If-None-Match
和 Safari 的问题,但它们都是关于它完全缺失的。就我而言,第一个请求不包含
If-None-Match
(如预期),第二个请求将包含,但第三个请求将不会。然后它在发送标头和不发送标头之间摇摆。我修改了代码,如果存在
304
标头,则返回
If-None-Match
,这会提示 Safari 在每个请求中发送标头,但不会使用分配的新值来更新
Etag
值。我知道这是预期的行为,但是当我返回 200 和新的
Etag
时,有没有办法让 Safari 表现得像 chrome 和 Firefox 一样?

javascript safari etag if-none-match
1个回答
0
投票

简短回答

不幸的是,直到 2023 年 12 月 11 日发布 17.2 早期版本时,Safari 才正式支持 ETags(实体标签)。这意味着在此日期之前,Safari 浏览器无法识别或理解 ETags,ETags 是一种HTTP 标头可用于通过允许服务器快速确定客户端是否已拥有资源的缓存副本来提高缓存性能。因此,依赖 ETag 进行缓存的网站在 17.2 之前的 Safari 浏览器中无法按预期运行。

对其他访客的更多解释:

ETag 是 Web 服务器和浏览器使用的一种机制,通过减少从服务器多次下载相同资源的需要来提高网页性能。当浏览器请求资源时,服务器可以在其响应中包含 ETag。然后,浏览器可以存储此 ETag 以及资源的缓存副本。如果浏览器随后请求相同的资源,它可以将 ETag 发送回服务器。如果 ETag 与服务器当前的资源表示匹配,服务器可以发回 304 Not Modified 响应,表明缓存的副本仍然有效。这样可以避免再次下载整个资源,从而节省时间和带宽。

但是,直到 2023 年 12 月发布 17.2 早期版本之前,Safari 才原生支持 ETag。这意味着依赖 ETag 进行缓存的网站将无法在 17.2 之前的 Safari 浏览器中按预期运行。开发人员必须采取解决方法,例如使用 Last-Modified 标头或 JavaScript 手动将资源的缓存副本与服务器的当前表示进行比较。

参考

© www.soinside.com 2019 - 2024. All rights reserved.