图标缓存的奇怪行为

und*_*ned 7 django caching http http-caching browser-cache

考虑一下这view会生成ico图像:

from django.http import HttpResponse
from app.somewhere import Favicon

# View URL: `/<str:colour>.ico`
def favicon( request, colour ):
    response = HttpResponse(
        Favicon.render( colour ),
        status=200
    )

    response['Content-Type'] = 'image/x-icon'
    response['Cache-Control'] = 'public, max-age=31536000'

    return response
Run Code Online (Sandbox Code Playgroud)

Favicon.render() 返回一个有效的字节流,对此不用理会。

这是我的HTML文档中的link元素head

<link rel=icon href=/7f9fa4.ico>
Run Code Online (Sandbox Code Playgroud)

现在出现了一个问题:为什么每次我重新加载页面时,浏览器Chromium 73都会向发送请求/7f9fa4.ico,而不是从缓存中检索图标?如果我将/7f9fa4.ico在新标签页中打开,则将首次向服务器发送请求,然后我的浏览器将从缓存中检索图像;现在告诉我浏览器缓存系统出了什么问题。


这是一个请求(忽略cookie和首选项)

GET /7f9fa4.ico HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Referer: http://localhost:8000/
Run Code Online (Sandbox Code Playgroud)

这些是响应头:

HTTP/1.1 200 OK
Date: Mon, 03 Jun 2019 07:03:58 GMT
Server: WSGIServer/0.2 CPython/3.6.8
Content-Type: image/x-icon
Cache-Control: public, max-age=31536000
X-Frame-Options: SAMEORIGIN
Content-Length: 196
Run Code Online (Sandbox Code Playgroud)

控制台输出(如果有帮助的话):

[05/Jun/2019 09:17:42] "GET /7f9fa4.ico HTTP/1.1" 200 196
Run Code Online (Sandbox Code Playgroud)

另外,如果我要从中删除link元素,那么每次我以相同的效果重新加载页面时head,浏览器都会向/favicon.ico(在我的情况下只是镜像/ffffff.ico)发出请求。

A. *_*arr 3

您可能会发现发出此请求是为了验证缓存的内容。我注意到您发送到服务器的请求有Cache-Control: no-cachePragma: no-cache

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#Cacheability

no-cache 强制缓存在释放缓存副本之前将请求提交到源服务器进行验证。

因此它强制缓存提交验证请求。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Pragma#Directives

无缓存 与缓存控制相同:无缓存。强制缓存在释放缓存副本之前将请求提交到源服务器进行验证。

这些规定浏览器在使用缓存图标之前应向您的服务器发送请求以进行“验证”。