我在两个不同的网站的两个不同页面上使用了相同的 PHP 代码。代码仅显示当前时间,并使用 max-age 将 http 缓存标头设置为 60 秒。我有一个 CDN 服务器。当我运行页面时,我看到 CDN 正在缓存来自服务器 1 的内容,但没有缓存来自服务器 2 的内容。我查看了 web-sniffer.net 中的标头条目,它们都显示 max-age 为 60。
http 标头是否依赖于服务器。由于两个网站都托管在共享服务器上,但由不同的提供商托管,除了代码和 .htaccess 之外,我还需要查看其他内容吗?
为什么 CDN 只缓存来自一台服务器的内容。为什么不尊重来自另一台服务器的 max-age 条目?
当我尝试在同一页面中实际查看标头条目时,我看到 HTTP_CACHE_CONTROL = max-age=0。那么,为什么 web-sniffer.net 和 curl 显示 max-age 为 60。哪一个是正确的。
我在页面上的代码:
header('Cache-Control: max-age=60, public');
echo date("F j, Y - H:i:s");
echo "<hr />";
foreach($_SERVER as $h=>$v)
if(ereg('HTTP_(.+)',$h,$hp))
echo "<li>$h = $v</li>\n";
>
附言:我在 Stackoverflow 上问过类似的问题,但没有得到任何有用的答案。所以,我想在这里发布它。Stackoverflow 上的问题位于:https://stackoverflow.com/questions/8022529/max-age-doesnt-work
答案1
我能够修复 max-age http 标头问题。
由于标头中存在“Vary: Accept-Encoding”,CDN 无法遵守“max-age”http 标头。显然,Accept-Encoding 标头是由 Apache 自动添加的。如果存在 Vary: Accept-Encoding 标头,CDN 似乎无法缓存响应。
添加SetEnv 强制不改变在 .htaccess 中抑制了响应中的 Vary 标头。这解决了问题,CDN 现在遵守了 max-age http 标头。