Apache-2.2
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">
問題:
- 第一次載入頁面(這裡命名為 si.php)
- 清理 access_log:
[root@localhost httpd]# > access_log
- 在 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"
- 使用 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 ……
編輯:
好的,正如公認的答案所建議的那樣,解決方案是:
- 未打開新瀏覽器(可能無法從記憶體中檢索)
- 不按f5
- 不只是在地址欄中按輸入
在此瀏覽器實例中第一次訪問該頁面後,任何後續正常訪問都將來自記憶體:
當您在瀏覽器中按 F5 時,您是在指示瀏覽器向伺服器和路徑中的任何代理詢問新內容。該 Cache-Control請求標頭就是這樣做的。它不會在正常導航期間添加。
此外,PHP 無法知道您的內容沒有更改,尤其是在它進行數據庫呼叫時。它永遠不會為請求返回 304,除非您添加程式碼使其在任何條件下都這樣做。您設置記憶體控制響應標頭的原因是,如果資源在記憶體中,瀏覽器甚至根本不會發出請求。
停止按 F5,正常瀏覽,並使用 Fiddler 或類似工具查看流量。您會發現,當您訪問您的 PHP 頁面時,然後轉到其他地方,然後在沒有按 F5的情況下返回瀏覽器顯示您的 PHP 頁面,甚至根本沒有從伺服器請求它。您正在通過按 F5 來更改正常的記憶體行為!