nginxexpires
指令设置了 2 个标头,Expires
并且Cache-Control
:
配置:
expires 1d;
标头:
Expires: Tue, 24 Nov 2020 12:51:31 GMT
Cache-Control: max-age=86400
我想保留Expires
标题但也将其设置Cache-Control
为public, max-age=86400, immutable
。但这会产生双Cache-Control
标题:
配置:
expires 1d;
add_header Cache-Control "public, max-age=86400, immutable"
标头:
Expires: Tue, 24 Nov 2020 12:57:53 GMT
Cache-Control: max-age=86400
Cache-Control: public, max-age=86400, immutable
我不能只使用add_header Expires ...
,因为它需要未来的准确时间,而不仅仅是秒数。
我尝试more_set_headers
使用ngx_headers_more模块,但指令Cache-Control
设置的标头expires
仍然存在。
有没有办法将正确的Expires
标题与Cache-Control
设置为结合起来immutable
?
答案1
标题重复Cache-Control
并不违反任何 W3C 标准。根据RFC 2616:
当且仅当该标头字段的整个字段值定义为逗号分隔列表 [即 #(values)] 时,消息中才可以存在具有相同字段名称的多个消息标头字段。必须能够将多个标头字段组合成一个“字段名称:字段值”对,而无需更改消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值都用逗号分隔。因此,接收具有相同字段名称的标头字段的顺序对于组合字段值的解释非常重要,因此代理在转发消息时不得更改这些字段值的顺序。
此外,nginx 知道这一点,尝试使用 nginx 指令设置不应包含多个值的标头add_header
将导致覆盖该标头值,而不是添加第二个值。因此,您可以放心地继续使用
expires 1d;
add_header Cache-Control "public, immutable";
配置。
答案2
Cache-Control: 标头可以出现多次,前提是两个标头不会尝试使用相同的指令。如果它们确实使用了相同的指令,则忽略该指令。(RFC 7234 § 4.2.1)
因此,您可以让 nginx 使用指令发送其标头max-age
,并仅使用其他指令发送您自己的标头。
结果是:
Expires: Tue, 24 Nov 2020 12:57:53 GMT
Cache-Control: max-age=86400
Cache-Control: public, immutable
(但如果max-age=86400
出现在两个标题中,它将被忽略。)
某些标头字段可能出现多次,这是正常且意料之中的。RFC 7230 § 3.2.1 规定收件人可以将它们组合成单个标头,但这不是必需的。