为什么我的AJAX结果没有ETag缓存(没有If-None-Match)?

时间:2018-04-06 11:52:30

标签: http express caching http-headers etag

这是我的AJAX功能:

function ajax(url, data) {
    return new Promise((resolve, reject) => {
        $.ajax({
            url: "https://xxx",
            data: data,
            method: 'POST',
            timeout: 50000,
            cache: true,
            ifModified: true,
            crossDomain: true,
            success: (data, textStatus, jqXHR) => {
                if (data == '@fail@') reject(data);
                else {resolve(data);}
            },
            error: (jqXHR, textStatus, errorThrown) => {
                reject(errorThrown);
            }
        });
    });
}

在Chrome中观察到 - >网络(F12),这是服务器的响应头:

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Content-Type: text/html; charset=utf-8
Content-Length: 3
ETag: W/"3-R7zlx09Yn0hn29V+nKn4CA"
Date: Fri, 06 Apr 2018 11:39:41 GMT
Connection: keep-alive

请求标头始终相同,即使在后续调用中也是如此:

POST /register HTTP/1.1
Host: xxx:60001
Connection: keep-alive
Content-Length: 0
Accept: */*
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Referer: http://localhost:8000/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

Chrome不应该在收到ETag标头后缓存资源并设置“如果 - 无匹配”。后续调用同一个URL的标题?我不能获得304而不是200的状态代码,因为返回的内容是相同的吗?

对其他服务器(如Google Map服务器)中的资源的调用有时会返回304。

1 个答案:

答案 0 :(得分:0)

This确认缓存通常仅限于GET请求方法:

  

但是,常见的HTTP缓存通常仅限于缓存对GET的响应,并可能拒绝其他方法。主缓存密钥由请求方法和目标URI组成(通常只使用URI,因为只有GET请求是缓存目标)

这也在a post in StackOverflow here确认。