服務器(本地開發 LAMP 服務器)端是 php ,測驗的瀏覽器是 chromium 和 librewolf (firefox 風格),兩者都表現出相同的行為,因此我認為我的 http 標頭有問題。
第一次請求時發送的標頭:
通過我的代碼:
"Connection : close"
"Content-Type : text/html; charset=UTF-8"
"Date : ".gmdate("D, d M Y H:i:s")." GMT";
"Last-Modified : ".$lastmod;
"Etag : ".$etag;
"Expires : 1" //can't have the browser doesn't check if file was modified on server
"Pragma : public"
"Cache-Control : max-age=1,must-revalidate"
經過ob_start("ob_gzhandler")
"Content-Encoding : gzip"
通過 apache 服務器:
"Connection : Keep-Alive"
"Keep-Alive : timeout=5, max=99"
"Server : Apache/2.4.46 (Unix) OpenSSL/1.1.1j PHP/8.0.3 mod_perl/2.0.11 Perl/v5.32.1"
"Transfer-Encoding : chunked"
"Vary : Accept-Encoding"
"X-Powered-By : PHP/8.0.3"
服務器檢查客戶端是否快取了檔案:
if (
((isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
&& $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod )
||
(!isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
&& isset($_SERVER['HTTP_IF_NONE_MATCH'])
&& trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)
)
)
{
header("HTTP/1.1 304 Not Modified");
header("Content-Length:0");
header('Etag:'. $etag);
header('Last-Modified:'.$lastmod);
exit;
}
第一次 librewolf(firefox) 和 chromium 重新請求頁面時,它們按預期發送 If-Modified-Since 和/或If-None-Match請求標頭并接收304 not modified頭并按預期接收標頭。
然而,在第一次重新請求之后,在收到一個304 not modified回應后,他們不再發送那些If-Modified-Since 和/或If-None-Match請求標頭,這使得該快取系統有一半時間無用。
如何告訴客戶端瀏覽器始終發送這些If-Modified-Since 和/或If-None-Match請求標頭而不是一次?
uj5u.com熱心網友回復:
我終于知道了!
標頭需要與第一次發送檔案時完全相同并以完全相同的順序發送,并且可能在內容長度和回應代碼之前(可能沒有那么嚴格,但我已經花了足夠的時間在這方面和我不會再調查了)
因此,就我而言,我必須發送:
header("Connection:close");
header("Date:".gmdate('D, d M Y H:i:s')." GMT");
header('Last-Modified:'.$lastmod);
header('Etag:'. $etag);
header("Expires:".gmdate('D, d M Y H:i:s',parent::$requesttime self::$expire));
header("Pragma:public");
header("Cache-Control:max-age=".self::$expire.", must-revalidate");
header("Content-Length:0");
header("HTTP/1.1 304 Not Modified");
和賓果游戲終于......不再是不必要的 200 了!
希望有一天這會對某人有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528365.html
上一篇:PDF未在燒瓶服務器中本地保存
