为什么放置在<link />中的图标不能从缓存中检索?

时间:2019-05-31 02:17:50

标签: django http browser-cache wsgi cache-control

请考虑以下渲染ico图像的视图,其中Favicon.render返回一个简单的PIL图像:

from django.http import HttpResponse
from io import BytesIO
from somewhere import Favicon

# View URL: `/favicon.<str:colour>.ico`
def favicon( request, colour ):
    bs = BytesIO()

    Favicon.render( colour ).save( bs, 'ICO' )

    response = HttpResponse( bs, status=200 )
    response['Content-Type'] = 'image/x-icon'
    response['Cache-Control'] = 'public, max-age=31536000'

    return response

这是我的HTML文档开头的link

<link rel=icon href=/favicon.7f9fa4.ico>

为什么每次我重新加载页面时,浏览器(Chromium 73.0.3683.86)都会向/favicon.7f9fa4.ico发送请求,而不是检索缓存的图像?

如何使浏览器始终从缓存中检索图标而不是向服务器发出请求?

我使用默认的Django WSGI服务器。

1 个答案:

答案 0 :(得分:3)

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

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

  

无缓存   强制缓存在释放缓存的副本之前将请求提交到原始服务器进行验证。

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

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

  

无缓存   与Cache-Control相同:无缓存。强制缓存在释放缓存的副本之前将请求提交到原始服务器进行验证。

这些状态表示浏览器应在使用缓存图标之前向服务器发送“验证”请求。