Странное поведение кеширования иконок - PullRequest
7 голосов
/ 31 мая 2019

Рассмотрим это 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

Favicon.render() возвращает допустимый поток байтов, не обращайте на это внимания.

Вот элемент link в head моего HTML-документа:

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

Теперь возникает вопрос: почему каждый раз, когда я перезагружаю страницу, мой браузер Chromium 73.0.3683.86 делает запросна /7f9fa4.ico вместо извлечения иконки из кеша?Если я открою /7f9fa4.ico на новой вкладке, первый раз будет отправлен запрос на сервер, далее мой браузер получит изображение из кеша;Теперь скажите мне, что не так с системой кэширования браузера.


Вот запрос (куки и предпочтения опущены) :

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/

И этиявляются заголовками ответа:

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

Вывод на консоль (если это как-то может помочь):

[05/Jun/2019 09:17:42] "GET /7f9fa4.ico HTTP/1.1" 200 196

Также, если я удалю элемент link из head,браузер будет делать запросы к /favicon.ico (который в моем случае просто отражает /ffffff.ico) каждый раз, когда я перезагружаю страницу с тем же эффектом.

1 Ответ

3 голосов
/ 07 июня 2019

Вы можете обнаружить, что этот запрос делается для проверки кэшированного содержимого. Я заметил, что запрос, отправленный на сервер, имеет Cache-Control: no-cache и Pragma: 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: без кеша. Вынуждает кэши отправлять запрос на исходный сервер для проверки перед выпуском кэшированной копии.

Они утверждают, что браузер должен будет отправить запрос на ваш сервер для «проверки», прежде чем использовать значок кэша.

...