【问题标题】:Merging s-maxage and max-age合并 s-maxage 和 max-age
【发布时间】:2013-12-17 04:54:34
【问题描述】:

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

【问题讨论】:

    标签: .htaccess mod-rewrite mod-expires


    【解决方案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>
    

    【讨论】:

    • 遵循您的建议,除了它首先显示 s-maxage,然后在下一行显示 max-age。
    • 它适用于我在 Apache Apache/2.4.4 上 - 你运行的是哪个版本的 Apache?您确定您的浏览器没有缓存响应吗?
    • 哦,我的服务器正在运行 LiteSpeed Enterprise... 我使用 Google 网站管理员帐户中的“Fetch as Google”来检查标题。
    • 根据litespeedtech.com/docs/webserver/config/general#htaccess,您的 htaccess 中不能有 IfModule 指令 - 您必须阅读他们的文档或询问他们的支持团队。
    • 您可以使用他们的开发工具在 Chrome 或 Firefox 中检查标头:按 F12 打开开发工具,单击“网络”选项卡并刷新,然后您可以单击请求以查看标头。
    【解决方案2】:

    如果您使用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 添加

    【讨论】:

      【解决方案3】:

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

      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。

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

      【讨论】:

        猜你喜欢
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2016-02-09
        • 2015-08-14
        • 2015-05-02
        • 1970-01-01
        • 2011-12-08
        相关资源
        最近更新 更多