HTTP Expires заголовок не соблюдается браузером? - PullRequest
19 голосов
/ 25 июня 2009

У меня есть ситуация, когда мой (встроенный) веб-сервер отправляет заголовок Expires, но браузер, похоже, не учитывает настройку заголовка, т.е., если я обновляю страницу, браузер запрашивает ресурсы, которые должны быть кэшированы , Ниже приведены обменные заголовки:

https://192.168.1.180/scgi-bin/ajax/ajax.cgi

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1
Host: 192.168.1.180
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)
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
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0

HTTP/1.x 200 OK
Date: Wed, 24 Jun 2009 20:26:47 GMT
Server: Embedded HTTP Server.
Connection: close
Content-Type: text/html
----------------------------------------------------------
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1
Host: 192.168.1.180
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)
Accept: image/png,image/*;q=0.8,*/*;q=0.5
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
Keep-Alive: 300
Connection: keep-alive
Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi
Cache-Control: max-age=0

HTTP/1.x 200 OK
Date: Wed, 24 Jun 2009 20:26:47 GMT
Server: Embedded HTTP Server.
Connection: close
Expires: Wed, 1 Jun 2011 20:00:00 GMT
Content-Type: image/jpg
----------------------------------------------------------

ajax.cgi возвращает html-страницу с логотипом (через скрипт static.cgi), который я бы хотел кэшировать, но браузер запрашивает логотип при каждом обновлении.

Ответы [ 4 ]

16 голосов
/ 26 июня 2009

Браузер игнорирует заголовок Expires, если вы обновите страницу. Он всегда проверяет, действительна ли запись в кэше, связываясь с веб-сервером. В идеале он будет использовать заголовок запроса If-Modified-Since, чтобы сервер мог вернуть «304 Не изменено», если запись в кэше все еще действительна.

Вы не устанавливаете заголовок Last-Modified, поэтому браузер должен выполнить безусловное получение содержимого, чтобы обеспечить его актуальность.

В этом блоге описаны некоторые практические правила для установки Expires и Last-Modified:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

13 голосов
/ 25 июня 2009

Что вы делаете в своем браузере? Похоже, вы нажимаете кнопку перезагрузки или даже что-то вроде shift + Reload. Обычно браузер не отправляет заголовок Cache-Control: max-age=0. Это означает, что браузер выбросил кэшированное изображение и хочет получить его снова.

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

Кроме того, вы можете добавить заголовок Cache-control: public в свой ответ. Это позволяет прокси и браузеру явно кэшировать изображение.

0 голосов
/ 12 июня 2014

Любые ошибки в вашем сертификате https приведут к тому, что браузер не будет учитывать ваши заголовки.

Попробуйте это без https и посмотрите, работает ли оно поверх простого http.

См. Этот ответ https://stackoverflow.com/a/17716911

0 голосов
/ 25 июня 2009

CGI-скрипт выглядит так, как будто у него есть параметр метки времени ... это не меняется, не так ли? Браузер должен обрабатывать каждый уникальный URL как отдельный объект в кэше, поэтому, если он обновляется при каждом запросе, он не будет совпадать с кэшированным изображением.

Кроме того, поле Expires не совсем в формате RFC 1123, потому что вам нужно две цифры для даты. Это может или не может быть проблемой, но это что-то проверить. Браузер включает Cache-Control: max-age=0, что указывает на то, что он считает, что его кэш потенциально устарел.

Как только сервер получает этот запрос проверки, он может вернуть 304 (Not Modified) или 200 (OK), как это происходит в настоящее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...