好吧,我的主页加载速度相对较慢......嗯,不是真的,大约需要一秒半。它是我网站上最慢的页面。
现在的问题是,对于未登录的用户,主页是当天 100% 的静态内容。
所以,我想这样做,如果你没有登录,那么内容就会被缓存在那天(如果他们已经登录,那么我不希望它被缓存)。
在过去的几个小时里,我一直在撕扯我的眼球,诅咒每一个有名的神,像疯子一样拿着斧头到处跑,试图让这件事起作用。我有网站的其他部分目前使用缓存很好,例如 CSS/JS/图像,以及所有这些,我真的很容易做到并且没有我现在遇到的这个问题。
直言不讳...它不会*缓存...我使用的是 HTTPS,但我不明白为什么它不会让我缓存主 html 文件,如果它让我缓存 JS/CSS/图像。
无论如何,所以我想你想知道我尝试了什么......
设置缓存控制:
date_default_timezone_set('Europe/Jersey');
$date = date("Y-m-d");
$date = date("D, d M Y", strtotime(date("d M Y", strtotime($date)) . " +1 day"));
$udate = date("D, d M Y", strtotime(date("d M Y", strtotime($date)) . " -1 day"));
header('Content-Type: text/html');
header("Cache-Control: max-age=86400, public, must-revalidate");
header("Last-Modified: " . $udate . " 00:00:01 GMT");
header('Expires: ' . $date . ' 00:00:01 GMT');
发送标头:
Cache-Control:max-age=604800, public, must-revalidate
Connection:Keep-Alive
Content-Encoding:gzip
Content-Language:en-GB
Content-Type:text/html; charset=utf-8
Date:Tue, 11 Sep 2012 00:55:11 GMT
Expires:Wed, 12 Sep 2012 00:00:01 GMT
Keep-Alive:timeout=2, max=75
Last-Modified:Tue, 11 Sep 2012 00:00:01 GMT
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
它缓存了吗?不,chrome 坚持以各种方式加载此页面,它会直接转到源,即使它已经存在(从缓存加载图像/js/css 等时)。
所以然后我尝试了ETags:
function caching_headers ($file, $timestamp) {
$gmt_mtime = gmdate('r', $timestamp);
header('ETag: "'.md5($timestamp.$file).'"');
header('Last-Modified: '.$gmt_mtime);
header('Cache-Control: public');
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime || str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5($timestamp.$file)) {
header('HTTP/1.1 304 Not Modified');
exit();
}
}
}
date_default_timezone_set('Europe/Jersey');
$date = date("D, d M Y") . " 0:0:0 GMT";
caching_headers('homepage', strtotime($date));
echo $_SERVER['HTTP_IF_MODIFIED_SINCE'];
它缓存了吗?不,它总是告诉我 HTTP_IF_MODI... 没有设置
我尝试了互联网上的许多其他代码,都失败了。
我错过了什么,必须有一种方法来缓存 html 文件,我见过很多网站都这样做。
我会很快解释的。
我的主页在用户未登录时具有每天更改一次的静态内容。就带宽大小而言,此页面自然拥有最多的内容,然后是我网站上的任何其他页面。
如果用户未登录,我想通过缓存内容来加速此页面,并且缓存仅持续到第二天早上 0:0:0。我需要它在 PHP 中,而不是在 htaccess 中,所以我可以检查用户是否已登录等。
我相信我需要使用 ETAG,但无论出于何种原因,我都无法让它们工作。据我了解,我使用的这个脚本叫做 minify,使用 ETAG 很好,所以并不是我的服务器禁用了它们。
老实说,我不知道我在用 ETAG 做什么,但帮助非常有限(每次有人寻求帮助时,唯一的回复是有人告诉他禁用它。)。
[编辑] 根据 php 文档尝试了基本缓存:
header("Pragma: public");
header("Cache-Control: max-age=604800");
header('Expires: ' . $date . ' 00:00:01 GMT');
没有骰子...