Apache-2.2

max-age=0 由瀏覽器發送,儘管標頭隨處修改

  • March 1, 2016

我的燈有標題/記憶體問題

$$ 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
  1. 在 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"
  1. 使用 live http headers firefox 擴展觀察 Http headers:
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請求標頭就是這樣做的。它不會在正常導航期間添加。

此外,PHP 無法知道您的內容沒有更改,尤其是在它進行數據庫呼叫時。它永遠不會為請求返回 304,除非您添加程式碼使其在任何條件下都這樣做。您設置記憶體控制響應標頭的原因是,如果資源在記憶體中,瀏覽器甚至根本不會發出請求。

停止按 F5,正常瀏覽,並使用 Fiddler 或類似工具查看流量。您會發現,當您訪問您的 PHP 頁面時,然後轉到其他地方,然後在沒有按 F5的情況下返回瀏覽器顯示您的 PHP 頁面,甚至根本沒有從伺服器請求它。您正在通過按 F5 來更改正常的記憶體行為!

引用自:https://serverfault.com/questions/701495