Подтвердить что ты не робот

Заголовок HTTP Expires не соблюдается браузером?

У меня есть ситуация, когда мой (внедренный) веб-сервер отправляет заголовок 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 script), который я хотел бы кэшировать, но браузер запрашивает логотип при каждом обновлении.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Любые ошибки в вашем https-сертификате заставят браузер не уважать ваши заголовки.

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

См. этот ответ fooobar.com/info/266691/...