У меня проблема с заголовками / кешем на моем веб-сайте, посвященном лампе [centos].
Конфиг:
[root@localhost httpd]# httpd -v
Server version: Apache/2.2.23 (Unix)
Server built: Nov 25 2012 15:03:00
[root@localhost httpd]# php -v
PHP 5.5.22 (cli) (built: Feb 20 2015 04:04:46)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2015, by Zend Technologies
php.ini:
session.cache_limiter = public
session.cache_expire = 535680
httpd.conf:
<IfModule mod_expires.c>
# enable expirations
ExpiresActive On
<FilesMatch "\.(php)$">
ExpiresDefault "access plus 1 month"
Header set Cache-Control "max-age=32140800, public"
Header unset ETag
Header unset Last-Modified
FileETag None
</FilesMatch>
</IfModule>
Мета-теги:
<meta HTTP-EQUIV="cache-control" CONTENT="public, max-age=32140800">
Проблема:
Чистый access_log:
[root@localhost httpd]# > access_log
Нажмите F5 в firefox / chrome:
[root@localhost httpd]# cat access_log
192.168.0.16 - user [25/Jun/2015:04:16:19 +0100] "GET /path/si.php HTTP/1.1" 200 642 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36"
Наблюдайте за заголовками Http с расширением Firefox для живых заголовков http:
http://192.168.0.249/path/si.php
GET /path/si.php HTTP/1.1
Host: 192.168.0.249
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.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
DNT: 1
Cookie: __utma=254085576.10126650.1407082841.1422764987.1429480306.10; __utmz=254085576.1407082841.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=1cuf6d8764vu2i2u1hin4pg665
Authorization: Basic cmVjZqR0ZTq1c2VyMQ==
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.1 200 OK
Date: Thu, 25 Jun 2015 03:18:04 GMT
Server: Apache
X-Powered-By: PHP/5.5.22
Expires: Fri, 01 Jul 2016 03:18:04 GMT
Cache-Control: max-age=32140800, public
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 643
Keep-Alive: timeout=15, max=13
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
С какой стати отправляется заголовок max-age = 0? Firefox и Chrome демонстрируют одинаковое поведение. Это дополнительные 170 мс, которые я сейчас не могу себе позволить.
Что еще более странно, так это код ответа 200 http. Я вообще не изменяю страницу, она должна как минимум вернуть 304 ...
Редактировать:
Хорошо, как предполагает принятый ответ, решение заключается в следующем:
После первого посещения страницы в этом экземпляре браузера любое последующее обычное посещение будет происходить из кеша:
Когда вы нажимаете F5 в браузере, вы инструктируете браузер запрашивать у сервера и всех прокси на пути новый контент. Этот Cache-Control запрос header делает именно это. Он не добавляется при нормальной навигации.
Кроме того, PHP не может узнать, что ваш контент не изменился, особенно если он обращается к базе данных. Он никогда не вернет 304 для запроса, если вы не добавите код, который заставляет его делать это при любых условиях. Причина, по которой вы устанавливаете кеш-контроль ответ заголовок так браузер даже не будет просить вообще если ресурс находится в кеше.
Перестаньте нажимать F5, просматривайте в обычном режиме и наблюдайте за трафиком с помощью Fiddler или аналогичного инструмента. Вы обнаружите, что когда вы посетите свою страницу PHP, затем перейдете в другое место, а затем вернетесь без нажатия F5 что ваш браузер показывает вашу PHP-страницу, даже не запрашивая ее с сервера. Вы изменяете это обычное поведение кеширования, нажимая F5!