重复的 max-age 标头

重复的 max-age 标头

我使用 Apache 2.4.25 通过代理传递来公开许多后端服务。Apache 还根据 mime 类型设置缓存控制标头。当前缓存配置如下所示:

ExpiresActive on
ExpiresDefault "now"
ExpiresByType text/html "now"
ExpiresByType image/gif "access plus 120 minutes"
ExpiresByType image/jpeg "access plus 120 minutes"
ExpiresByType image/png "access plus 120 minutes"
ExpiresByType text/css "access plus 60 minutes"
ExpiresByType text/javascript "access plus 60 minutes"
ExpiresByType application/x-javascript "access plus 60 minutes"
ExpiresByType text/xml "access plus 60 minutes"
ExpiresByType application/javascript "access plus 60 minutes"
ExpiresByType application/x-font-ttf "access plus 30 days"
ExpiresByType application/x-font-woff "access plus 30 days"
ExpiresByType application/x-font-eot "access plus 30 days"
ExpiresByType application/x-font-svg "access plus 30 days"

但是,其中一个后端服务还设置了 cache-control max-age 标头。这导致响应标头包含两个 max-age 设置。

Chrome 中显示重复的最大代理值

当浏览器显示两个具有不同值的 max-age 设置时,它会如何反应?此外,在添加默认值之前,是否可以检查现有的缓存控制标头?

答案1

如果您不希望由于后端发送相同的标头而导致意外重复,请使用标头“set”而不是标头“add”。

答案2

根据最新的 mod_expires 文档:http://httpd.apache.org/docs/current/mod/mod_expires.html

当 Expires 标头已经是服务器生成的响应的一部分时 [...] 此模块不会更改或添加 Expires 或 Cache-Control 标头。

因此,一种选择是让后端除了已经设置的 Cache-Control 标头之外,还设置一个 Expires 标头。例如,在 PHP 中:

$seconds = 60;
header("Expires: ". gmdate('D, d M Y H:i:s', time() + $seconds). ' GMT');
header("Cache-Control: max-age=". $seconds);

答案3

当 Expires 标头已经是服务器生成的响应的一部分时 [...] 此模块不会更改或添加 Expires 或 Cache-Control 标头。

事实并非如此,Apache 仍然添加了额外的Cache-Control标题Expires

相关内容