Задать вопрос
@blecked88

Почему не кэшируются страницы на клиенте?

У меня есть очень простой пример сервера на Go, где я пытаюсь заставить браузер кэшировать страницу

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("handle")
	w.Header().Set("Cache-Control", "public, max-age=31536000, immutable")
	w.Write([]byte("<html>ТЕСТ</html>"))
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}


Но при последовательной отправке запросов получаю такие ответы

HTTP/1.1 200 OK
Cache-Control: public, max-age=31536000, immutable
Date: Tue, 22 Apr 2025 22:29:21 GMT
Content-Length: 21
Content-Type: text/html; charset=utf-8

HTTP/1.1 200 OK
Cache-Control: public, max-age=31536000, immutable
Date: Tue, 22 Apr 2025 22:29:26 GMT
Content-Length: 21
Content-Type: text/html; charset=utf-8

HTTP/1.1 200 OK
Cache-Control: public, max-age=31536000, immutable
Date: Tue, 22 Apr 2025 22:29:27 GMT
Content-Length: 21
Content-Type: text/html; charset=utf-8

т.е. Date меняется, кэширования нет. В браузере (firefox) также нет пометки о том, что страничка взята из кэша.
Какие только я не пробовал заголовки, что только не делал - не кэшируется и все страница в браузере
  • Вопрос задан
  • 169 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Заголовком "Date:" вы указываете локальное время сервера, от которого браузер рассчитывает свои сроки.

А где в ответе сервера заголовок "Last-Modified:" именно этой страницы? Ну или "E-Tag:" от неё-же? Нет их.

После добавления заголовка(ов) нужно смотреть уже запросы, что бы в них был заголовок "If-Modified-Since:" с датой из "Last-Modified:", ну или "If-None-Match:" с содержимым "E-Tag:" предыдущего ответа.

Вот тогда и присматривайтесь к 304 Not Modified.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
402d
@402d
начинал с бейсика на УКНЦ в 1988
Попытка рулить кешированием динамически генерируемых страниц дело НЕБЛАГОДАРНОЕ.
А

w.Header().Set("Cache-Control", "public, max-age=31536000, immutable")

Вообще убивает всю идею динамического сайта, проще уж сразу залить статические html страницы
Директивой выше Вы разрещаете прокси отдавать закешированную страницу больше чем на неделю любому кто сидит за этим же прокси.

Как правильно указали в ответе рядом тут нужно рулить через время модификации страницы и/или сигнатурой (E-tag). В этом случае количество заросов к серверу будет тоже, но исходящий трафик сократится до минимума (304 ответ)

Но опять же придется долго расчитывать или специально разверствывать сайт так, чтобы не пострадала юзабельность сайта и был смысл в кешировании.

Возьмем для примера новостной сайт. Страница вывода конкретной новости.
Берем за время модификации дату последней редакции самой статьи. Ок вроде все хорошо.
Но сбоку у нас колонка "Новости по теме".
Смотрим дату самой свежей в этом блоке. Вкрутили "Последние". И все у нас
свелось к дате последнего действия в админке.
Ок а если еще коментарии. И кеширование свелось к интервалу в каком общаются посетители.
А есть еще разница "гость/авторизованный"

Все еще осталось желание кешировать страницы у клиентов ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы