设置 Clear-Site-Data header 时的预期行为?

Expected behavior when Clear-Site-Data header is set?

根据 docs:

Clear-Site-Data header clears browsing data (cookies, storage, cache) associated with the requesting website

现在尝试一下,您可以在屏幕截图 (Firefox v76) 中看到,在响应部分,在浏览器中设置了 Clear-Site-Data,但是,您仍然可以看到资产为 "cached" :

注意:即使在导航 back/forth 一段时间后,缓存的资产似乎也没有被清除。

我的印象是这会立即发生,但我无法让它工作。这是应该立即发生还是在一段时间后发生,或者我只是错过了其他一些?


更新给关心的人:

Clear-Site-Data 似乎只适用于 localhosthttps

Is this suppose to happen instantly or after some time, or I am just missing some else?

它应该会立即发生。 (草稿)spec states:

If the Clear-Site-Data header is present in an HTTP response received from the network, then data MUST be cleared before rendering the response to the user.

此外,正如您在 this comment 中提到的,仅当请求是安全的(httpslocalhost)时才支持它。

我准备了一个简单的测试,有两个资源:

  • index.html -- 链接到 CSS 文件的页面,还接受 ?clear 查询参数以包含 CSD header回应
  • style.css -- 具有随机颜色的 CSS 页面,以表明它何时重新生成,并声明自己为可缓存的

这符合 Firefox 76.0.1 的规定;在使用 Clear-Site-Data: "cache" 接收资源时,在获取其子资源之前清除缓存。

没有Clear-Site-Data:

  • 通过输入 URL 并按 Enter
  • 来获取 index.html
  • 重复这个。请注意,引用的 style.css 是从缓存中提供的,页面颜色不会改变

Clear-Site-Data:

  • 通过输入 URL 并按 Enter
  • 来获取 index.html?clear
  • 重复这个。请注意,引用的 style.css 不是 从缓存中提供的,并且页面颜色更改

代码:

#!/usr/bin/python3

import http.server
import socketserver

import random

PORT = 8000

class SampleDataHandler(http.server.SimpleHTTPRequestHandler):

    def do_GET(self):
        if ".css" in self.path:
            self.send_response(200)
            self.send_header('Content-Type', 'text/css')
            self.send_header('Cache-Control', 'max-age=3600')
            self.end_headers()
            color = b"%06x" % random.randint(0, 0xFFFFFF)
            self.wfile.write(b"html{background-color: " + color + b";}\n")
        else:
            self.send_response(200)
            if '?clear' in self.path:
                self.send_header('Clear-Site-Data', '"cache"')
            self.end_headers()
            self.wfile.write(b"<link rel=stylesheet href=style.css>This is the content.\n")


httpd = socketserver.TCPServer(("", PORT), SampleDataHandler)

httpd.serve_forever()