Заголовок If-None-Match не отправляется браузерами

#web-applications #browser-cache #servlet-filters #cache-control #etag

#веб-приложения #браузер-кэш #servlet-фильтры #управление кэшем #etag

Вопрос:

Я пытаюсь исправить производительность веб-приложения из-за интенсивной загрузки файлов при каждом входе в систему. Для этого я хочу включить условное кэширование браузера, то есть, если ETag изменится, отправьте новую копию с сервера, иначе используйте кэш браузера.

Заголовки ответов отправляются с сервера через фильтр Java:

 HTTP/1.1 200 OK
Cache-Control: max-age=25200, s-maxage=25200, private, must-revalidate
Date: Thu, 04 Apr 2019 15:12:28 GMT
Pragma: no-cache
Accept-Ranges: bytes
Content-Length: 875914
Content-Type: text/javascript
Last-Modified: Thu, 04 Apr 2019 12:05:21 GMT
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000; includeSubDomains
ETag: 040419095614
Cookie: JSESSIONID=*******; secure; HttpOnly
X-Frame-Options: SAMEORIGIN
  

При следующем вызове браузером отправленные заголовки запроса являются:

 GET ***.js HTTP/1.1
Host: *****
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Accept: */*
Referer: *****
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: JSESSIONID=*********
  

Браузер не отправляет заголовок If-None-Match, и поэтому код на стороне сервера для проверки ETag и отправки кода ответа 304 завершается ошибкой, и сервер всегда отправляет клиенту новую копию.

Я пробовал другой заголовок Cache-Control, такой как:

 Cache-Control: no-cache, must-revalidate, max-age=0  
  

но безрезультатно.
Может кто-нибудь, пожалуйста, помочь. Также очень важно, чтобы веб-приложение отображало свежий контент всякий раз, когда изменяется ETag.

Ответ №1:

Ваш ETag неверен, потому что в нем отсутствуют двойные кавычки, требуемые спецификацией. Попробуйте:

 ETag: "040419095614"
  

Комментарии:

1. Спасибо за ответ. Но даже после добавления двойных кавычек с обеих сторон ETag браузер не отправляет заголовок If-None-Match.

Ответ №2:

Я знаю, что прошло много времени с тех пор, как это было активно, но недавно у меня возникла аналогичная проблема.

В моем случае заголовок If-None-Match был правильно отправлен интерфейсом, но когда мы смотрим на ведение журнала, заголовок If-None-Match никогда не достигал нашего прокси-сервера nginx для некоторых наших пользователей. Оказывается, некоторые компании фильтруют эти заголовки, и поэтому заголовки If-None-Match не попадают на сервер.

Так что, если кто-нибудь когда-нибудь снова столкнется с этой проблемой, это может быть потенциальной причиной.