【发布时间】:2022-10-31 10:42:34
【问题描述】:
服务器(本地开发 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 请求标头而不是一次?
【问题讨论】:
标签: php performance apache http-headers request-headers