Может ли кто-нибудь помочь мне с вопросом кеширования HTTP?
Я думал, что если я установлю заголовки запроса «Expires» и «Cache-Control: max-age», то браузер не будет делать GET-запрос до тех пор, пока не пройдет max-age?
Мой сервер видит множество условных запросов GET и отвечает 304. Однако я бы хотел исключить эти условные GET, если это возможно, и сделать так, чтобы браузер запрашивал ресурс только тогда, когда он считает, что срок его действия истек.
Вот подробности, которые я получаю от инструментов разработчика в Chrome:
Request URL:http://localhost:8080/img/branding.gif
Request Method:GET
Status Code:304 Not Modified
Заголовки запроса:
Cache-Control:max-age=0
If-Modified-Since:Thu, 22 Jul 2010 10:54:34 GMT
Referer:http://localhost:8080/
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4
Заголовки ответа:
Cache-Control:max-age=2246400, s-maxage=0
Connection:Keep-Alive
Content-Location:/img/branding.gif
Content-Type:image/gif
Date:Fri, 23 Jul 2010 15:06:10 GMT
Expires:Fri, 07 Jan 2011 15:06:10 GMT
Keep-Alive:timeout=15, max=100
Last-Modified:Thu, 22 Jul 2010 10:54:34 GMT
Pragma:cache
Server:Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)
Я установил заголовки кеша в фильтре в моем коде Java. Код работает на Oracle OC4J.
Кроме того, я хочу запустить это через HTTPS. Будет ли работать с такими же заголовками и для HTTPS?
Заранее спасибо.
если вы удалите заголовки Last-Modified и ETag, вы полностью исключите запросы If-Modified-Since и If-None-Match и их 304 Not Modified Responses, поэтому файл останется в кэше без проверки обновлений, пока заголовок Expires не укажет новый контент доступен.
источник: http://www.askapache.com/htaccess/apache-speed-last-modified.html
Я думал, что если я установлю заголовки запроса «Expires» и «Cache-Control: max-age», то браузер не будет делать GET-запрос до тех пор, пока не пройдет max-age?
Проблема в том, что происходит после max-age истек. Затем вы попадаете в неприятный цикл, когда браузер запрашивает контент каждый раз, когда видит ссылку на него - и каждый раз, когда веб-сервер отвечает 304 неизмененным. Некоторые браузеры даже спрашивают каждый раз, когда файл появляется на той же странице! Большая часть времени, затрачиваемого на запрос, - это круговые обходы для установления связи TCP, а затем заголовков HTTP, поэтому это часто приводит к тому, что страница становится еще медленнее, потому что вы (почти) предоставили детали кеширования. Эффект от SSL еще хуже, потому что это приводит как минимум к одному дополнительному обходу до сервера и обратно.
Предложение get out в спецификации заключается в том, что веб-сервер может ответить на условный запрос, предоставив исходному файлу новые инструкции кэширования, но на практике это может быть довольно сложно сделать.
Если это apache 2.0 или новее, вы можете решить проблему, удалив условные части запроса с помощью mod_headers (удалите строки if-modified-Since И if-none-match в заголовке запроса). Для версии 1.3 или более ранней вы можете обойти это, создав задание cron, которое затрагивает файлы каждые N дней (где N немного меньше, чем время кеширования по умолчанию).
Кроме того, я хочу запустить это через HTTPS. Будет ли работать с такими же заголовками и для HTTPS?
Я предполагаю, что приведенный вами пример не является SSL. Да, этот метод будет работать для не-ssl, но обратите внимание на keep-alive браузера (не-Microsoft веб-сервер запутается в узлах, пытаясь поговорить по SSL-соединению с Keep-alive, но это значительно улучшает производительность) .
С.