Странное поведение кэширования иконок

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

Теперь возникает вопрос: почему каждый раз, когда я перезагружаю страницу, мой браузер Хром 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/

А это заголовки ответа:

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) каждый раз, когда я перезагружаю страницу с тем же эффектом.

Пожалуйста, попробуйте вручную указать в html этот тег <link rel = "icon" type = "image/x-icon" href = "/7f9fa4.ico" /> и напишите результат.

Sergey Miletskiy 05.06.2019 10:25

@SergeyMiletskiy без обид, но если бы решение было таким простым, я бы сам его сделал. Я пробовал - никаких результатов.

Pierre Dunn 05.06.2019 11:15

ничего личного, это просто процесс развития. :) Моя следующая идея - вы запускаете свой сервер в режиме DEBUG, поэтому статическая подача отличается. Попробуйте установить DEBUG=False

Sergey Miletskiy 05.06.2019 12:17

@SergeyMiletskiy до сих пор не действует.

Pierre Dunn 05.06.2019 14:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
4
427
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

no-cache Forces caches to submit the request to the origin server for validation before releasing a cached copy.

Таким образом, он заставляет кеши отправлять запрос на проверку.

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

no-cache Same as Cache-Control: no-cache. Forces caches to submit the request to the origin server for validation before releasing a cached copy.

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

Другие вопросы по теме