Заголовки для предотвращения запросов 304 / If-modified-since / HEAD

Какие заголовки я должен отправлять, чтобы полностью остановить все запросы на сервер после кэширования содержимого?

У нас есть сервер с очень высокой задержкой (Sigh, VMWare), поэтому даже отправка запроса HEAD на сервер занимает + 40 мс.

В настоящее время эти заголовки отправляются /принимаются;

Первый запрос

Клиент отправляет:

  GET http: //dugong: 8080 /Rvi24mYJkxFRGNzq73PPvgWGh1j /IMG_2071.jpg HTTP /1.1
Хост: dugong: 8080
User-Agent: Mozilla /5.0 (Windows NT 5.1; rv: 9.0) Gecko /20100101 Firefox /9.0
Accept: text /html, application /xhtml + xml, application /xml; q = 0.9, * /*; q = 0.8
Accept-Language: en-us, en; q = 0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7
Pragma: no-cache, no-cache, no-cache
Cache-Control: no-cache, no-cache, no-cache
 

Сервер отвечает;

  HTTP /1.1 200 OK
Сервер: nginx /1.0.11
Дата: ср, 01 фев. 2012 14:51:51 GMT
Content-Type: text /plain
Vary: Accept-Encoding
Последнее изменение: Вт, 31 Янв 2012 10:45:11 GMT
Контент-длина: 14
Истекает: Чт, 31 Янв. 2013 14:51:51 GMT
Cache-Control: max-age = 31536000
 

Поэтому он отправляет заголовок Cache-Control и Expires , установленный на 365 дней в будущем. К сожалению, во втором обновлении он снова запрашивает объект с заголовком If-Modified-Since .

Второй запрос

  GET http: //dugong: 8080 /Rvi24mYJkxFRGNzq73PPvgWGh1j /IMG_2071.jpg HTTP /1.1
Хост: dugong: 8080
User-Agent: Mozilla /5.0 (Windows NT 5.1; rv: 9.0) Gecko /20100101 Firefox /9.0
Accept: text /html, application /xhtml + xml, application /xml; q = 0.9, * /*; q = 0.8
Accept-Language: en-us, en; q = 0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,7
If-Modified-Since: Tue, 31 Jan 2012 10:45:11 GMT
Cache-Control: max-age = 0
 

Ответ;

  HTTP /1.1 304 Не изменено
Сервер: nginx /1.0.11
Дата: ср, 01 фев. 2012 14:58:00 GMT
Vary: Accept-Encoding
Истекает: Чт, 31 Янв. 2013 14:58:00 GMT
Cache-Control: max-age = 31536000
 

К сожалению, из-за глупого устаревшего прокси-программного обеспечения мы не можем использовать Keep-Alive или помещать любые другие серверы /прокси перед приложением. Мы также не можем улучшить производительность сервера и сократить время ожидания сети. Я пытался выяснить, какие заголовки мы можем отправить, чтобы избавиться от 301 запросов. Я пробовал использовать ETags, но это не имеет никакого значения, оно все равно отправляет заголовок If-modified-since . Я также попытался удалить заголовок Last-Modified , но это просто вызывает стандартный запрос GET без кэширования (проверено журналы, сервер все еще получает запросы).

Клиенты представляют собой смесь Firefox (в основном), IE 7, 8 и (некоторые) 9, Chrome и Safari, но это поведение появляется во всех проверенных браузерах.

TL; DR;

Ужасная сеть, какие заголовки я должен отправлять, чтобы сообщить клиентам никогда никогда отправлять If-modified-since запросы на сервер для проверки их кеша и сохранять контент кэшируется до тех пор, пока не будет удовлетворен заголовок Expires ?

Мне, вероятно, не хватает чего-то очевидного, но все, что я пытаюсь, похоже, дает те же результаты.

<суб> У нас есть сервер NGINX, сидящий перед нашим сервером приложений, поэтому я могу добавлять /удалять любые заголовки, как мне заблагорассудится. Наш прокси-сервер не поддерживает Keep-Alive и не может улучшить качество работы. Из-за ужасного программного обеспечения веб-приложение загружает +100 ресурсов на каждую загрузку страницы (да, корпоративное программное обеспечение отстойно) с задержкой ~ 40-50 мс на объект.

29 голосов | спросил Smudge 1 FebruaryEurope/MoscowbWed, 01 Feb 2012 19:13:02 +0400000000pmWed, 01 Feb 2012 19:13:02 +040012 2012, 19:13:02

4 ответа


25

Вы не можете контролировать, какие заголовки пользовательские агенты решают отправить вам. Если файл находится в кеше браузера, и он решил, что ему нужно проверить новую версию, то это произойдет. Согласно этой статье , это ситуации, которые браузеры запросят с помощью If-Modified-Since:

  
  • Кэшированная запись не имеет даты истечения срока действия, и содержимое просматривается в первый раз в сеансе браузера.
  •   
  • Кэшированная запись имеет срок годности, но срок ее действия истек.
  •   
  • Пользователь запросил обновление страницы, нажав кнопку «Обновить» или нажав F5
  •   

Итак, если вы перезагружаете страницу для проверки своего кеширования, она не будет работать, поскольку браузер повторно запросит изображения. Попробуйте нажать ссылку, а затем еще одну ссылку на первую страницу. Если ваши пользователи регулярно перезагружают страницы, вам может потребоваться переосмыслить структуру вашего сайта /приложения, чтобы это предотвратить.

Одна вещь, которая может помочь, заключается в добавлении «public» в заголовок управления кешем, то есть Cache-Control: public, max-age = 31536000 . Я также недавно узнал , что дата истечения срока действия более одного года является недействительным. Поскольку срок действия вашего истечения составляет ровно один год, возможно, снижение на несколько дней или недель гарантирует, что файл остается в кешках браузера и не будет отброшен.

ответил DisgruntledGoat 1 FebruaryEurope/MoscowbWed, 01 Feb 2012 20:45:56 +0400000000pmWed, 01 Feb 2012 20:45:56 +040012 2012, 20:45:56
3

Что вам нужно, это ключевое слово immutable в вашей строке Cache-Control . Пример для php:

  header ('Cache-Control: public, max-age = 80000, immutable');
 

Источник: https: //код .facebook.com /сообщения /557147474482256 /это браузер-настройка сохраняемый-60-из-запросов к facebook /

ответил Zdenek 25 MarpmSat, 25 Mar 2017 18:26:23 +03002017-03-25T18:26:23+03:0006 2017, 18:26:23
2

У меня была такая же проблема, и запросы, безусловно, попали на сервер, чтобы он ответил статусом 304 - я отправляю 304 через некоторый C # и, несомненно, попадает на сервер. .

У меня был только Cache-Control: private . Нет max-age и no Expires Он работает как ожидалось; удалите сервер с помощью If-Modified-Since , где я проверяю значение по сравнению с тем, что ожидаю, и поставьте 304 w /empty response body - else 200 & amp; полный тело ответа.

Настройка заголовка Expires имела желаемые результаты, 200 - (from cache) на клиенте & amp; HTTP-запросы не попадают на сервер.

Но .. Я обнаружил, что установка BOTH max-age = & amp; Истекает может заставить браузеры не отправлять If-Modified-Since заголовок И не кэшировать вообще , если значения не совпадают .

Что-то, что нужно знать, если у вас есть проблемы с кешированием и amp; использовали разные заголовки в комбинации.

ответил Andrew Scott 12 32014vEurope/Moscow11bEurope/MoscowWed, 12 Nov 2014 18:20:04 +0300 2014, 18:20:04
1

Немного не по теме, но, возможно, полезно. Еще одним улучшением ваших запросов кэшированного контента является кэширование в sessionStorage, поэтому вам не нужно запрашивать сервер для проверки кеша и получения 304. Посмотрите, например, Google, откройте консоль и запишите sessionStorage. Вы увидите, что они кэшируют CSS или DOM с помощью sessionStorage. ofc, вы не можете использовать это в старых браузерах IE.

ответил Pablo Estornut 27 72016vEurope/Moscow11bEurope/MoscowSun, 27 Nov 2016 21:05:14 +0300 2016, 21:05:14

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132