2

我目前在我的 htaccess 中有这个。

<IfModule mod_headers.c>
  Header set Cache-Control 's-maxage=604800'
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType text/html A86400
</IfModule>

HTTP 标头将显示为...

Cache-Control: s-maxage=604800
Cache-Control: max-age=86400
Expires: Wed, 18 Dec 2013 03:51:18 GMT

如何合并 s-maxage 和 max-age 使其显示为:

Cache-Control: max-age=86400, s-maxage=604800

我尝试过使用 Header 集、追加、合并和添加,但没有任何效果。似乎 ExpiresActive On 会自动将 Cache-Control: max-age 包含到标题中。

4

3 回答 3

2

根据手册,订购很重要。尝试重新排序这两个指令并使用merge以防止任何重复:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType text/html A86400
</IfModule>
<IfModule mod_headers.c>
  Header merge Cache-Control 's-maxage=604800'
</IfModule>
于 2013-12-17T10:22:03.363 回答
0

如果使用Header edit,您可以根据 max-age 标头添加 s-maxage 标头:

ExpiresByType text/html A86400
ExpiresByType text/xml A86401

Header edit Cache-Control ^(max-age=86400)$ "$1; s-maxage=604800"

结果:s-maxage 只为 text/html 添加

于 2019-03-07T08:46:53.727 回答
0

简单的答案是,可能没有一种简单的方法可以连接您的两个标题,但这实际上并不重要。这种形式在语义上没有区别:

Cache-Control: s-maxage=604800
Cache-Control: max-age=86400

这种形式:

Cache-Control: s-maxage=604800, max-age=86400

RFC 7234 § 5.2Cache-Control标头字段值定义为以特定形式定义的指令列表:

Cache-Control   = 1#cache-directive

cache-directive = token [ "=" ( token / quoted-string ) ]

该表单受RFC 2616 § 4.2中的 HTTP 规则的约束:

#(values)当且仅当该报头字段的整个字段值被定义为逗号分隔列表[即, ]时,具有相同字段名称的多个消息头字段可能出现在消息中。必须可以将多个头字段组合成一个“字段名称:字段值”对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔。因此,接收具有相同字段名称的头字段的顺序对组合字段值的解释很重要,因此代理不能在转发消息时更改这些字段值的顺序。

(请注意,#(values)语法在第 2.1 节中定义)

因此,如果客户端以不同的方式处理这两种变体,则违反了 HTTP/1.1。

事实上,您所看到的两个标题实际上有可能作为单个联合标题行发送到客户端,但是您的查看器或输出将指令分成两部分进行显示。

于 2019-09-24T08:23:50.980 回答