Назад | Перейти на главную страницу

max-age = 0 отправлено браузерами, несмотря на повсеместное изменение заголовков

У меня проблема с заголовками / кешем на моем веб-сайте, посвященном лампе [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">

Проблема:

  1. Загрузите страницу в первый раз (здесь с именем si.php)
  2. Чистый access_log:

    [root@localhost httpd]# > access_log
    
  3. Нажмите 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"
    
  4. Наблюдайте за заголовками 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 ...


Редактировать:

Хорошо, как предполагает принятый ответ, решение заключается в следующем:

  1. не открывать новый браузер (может не извлекаться из кеша)
  2. не нажимая f5
  3. не просто нажатие клавиши ввода в адресной строке

После первого посещения страницы в этом экземпляре браузера любое последующее обычное посещение будет происходить из кеша:

Когда вы нажимаете F5 в браузере, вы инструктируете браузер запрашивать у сервера и всех прокси на пути новый контент. Этот Cache-Control запрос header делает именно это. Он не добавляется при нормальной навигации.

Кроме того, PHP не может узнать, что ваш контент не изменился, особенно если он обращается к базе данных. Он никогда не вернет 304 для запроса, если вы не добавите код, который заставляет его делать это при любых условиях. Причина, по которой вы устанавливаете кеш-контроль ответ заголовок так браузер даже не будет просить вообще если ресурс находится в кеше.

Перестаньте нажимать F5, просматривайте в обычном режиме и наблюдайте за трафиком с помощью Fiddler или аналогичного инструмента. Вы обнаружите, что когда вы посетите свою страницу PHP, затем перейдете в другое место, а затем вернетесь без нажатия F5 что ваш браузер показывает вашу PHP-страницу, даже не запрашивая ее с сервера. Вы изменяете это обычное поведение кеширования, нажимая F5!