尽管所有地方都修改了标头,但浏览器仍发送 max-age=0

尽管所有地方都修改了标头,但浏览器仍发送 max-age=0

我的 lamp [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. 在 Firefox/Chrome 中按 F5:

    [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. 不仅仅是在地址栏中按回车键

在此浏览器实例中第一次访问该页面后,任何后续的正常访问都将来自缓存:

在此处输入图片描述

答案1

当你在浏览器中按下 F5 键时,你正在指示浏览器向服务器和路径中的任何代理询问新内容。Cache-Control要求header 就是这个功能。在正常导航过程中不会添加它。

此外,PHP 无法知道您的内容没有改变,尤其是在进行数据库调用时。除非您添加代码使其在任何条件下都返回 304,否则它永远不会返回请求的 304。设置缓存控制的原因回复标题是浏览器根本不会提出请求如果资源在缓存中。

停止按 F5,正常浏览,并使用 Fiddler 或类似工具查看流量。你会发现,当你访问你的 PHP 页面时,然后转到其他地方,然后返回无需按 F5您的浏览器甚至无需向服务器请求即可显示您的 PHP 页面。通过按 F5,您可以改变正常的缓存行为!

相关内容