合并s-maxage和max-age

时间:2013-12-17 04:54:34

标签: .htaccess mod-rewrite mod-expires

我目前在我的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到标题。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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"

结果:仅针对text / html添加s-maxage

答案 2 :(得分: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。

实际上,您看到的是两个标头,实际上是作为单个联合标头行发送到客户端的,但是您的查看器或输出会将指令拆分为两个以显示。

>