【问题标题】:Set a header by Content-Type按 Content-Type 设置标题
【发布时间】:2014-03-06 23:09:30
【问题描述】:

我以前用过这个;

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/gif "now plus 2 weeks"
  // Lots omitted here
</IfModule>

还有这个;

<IfModule mod_headers.c>
  <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|JPG)$">
    Header set Cache-Control "max-age=1209600"
  </filesMatch>
  // Lots omitted here
</IfModule>

我可以通过内容类型设置过期时间,我可以通过文件扩展名设置我希望的任何标题。

但这些似乎都不允许您按内容类型设置任何您想要的标题。

我想根据响应的内容类型设置缓存控制标头 - 请注意,这与文件扩展名不同。我有“友好的 URL”,所以filesMatch 没有文件扩展名,所以没有文件扩展名,但内容类型是 text/html

如何为特定内容类型设置缓存控制标头?

【问题讨论】:

  • 您的响应中是否存在 Cache-Control 标头?
  • "如何为特定的内容类型设置缓存控制标头?" - 这就是ExpiresByType 指令的作用(具体来说,它设置了Cache-Control 标头的max-age 指令,以及Expires 标头以实现向后兼容性)。但是,如果您想在 Cache-Control 标头中设置“任何标头”或特定指令,那么您将需要不同的方法。

标签: apache header apache2 content-type


【解决方案1】:

在 2.4 中,您可以将 expr= 附加到 Header 指令而不是 env=。例如:

Header set Cache-Control "max-age=3600" "expr=%{CONTENT_TYPE} == 'text/html'"

在默认(非早期)模式下,mod_headers 作为输出过滤器运行 - 因此内容类型已设置并可由表达式解析器使用。

http://httpd.apache.org/docs/2.4/expr.html

【讨论】:

  • 谢谢,但我使用的是 2.2 版
  • Apache 2.4 expression docs 表示CONTENT_TYPE&lt;If&gt; 期间不可用。我发现这不准确,它在&lt;If&gt; (2.4.52) 期间可用。
  • @Jeff 我认为这不是真的,除了你有“标题设置早期内容类型”的人为情况。 pastebin.com/3kP2syS3 演示了与手册匹配的当前行为在概念级别上: 表达式在以下所有情况发生之前进行评估,因此查询 1 不应该有有意义的内容类型可用。在请求映射到磁盘 2 之前. 在调用“type_checker”钩子以允许模块猜测内容类型之前 3. 在“处理程序”(CGI、代理等)运行之前,它将在处理期间设置内容类型
【解决方案2】:

我猜您需要先附加或设置 Cache-Control 标头。请尝试下面的 sn-p,不要忘记“no-transform”参数。

<IfModule mod_expires.c>
   ExpiresActive On
   ExpiresByType image/gif "now plus 2 weeks"
  // Lots omitted here

  //This is the magic
  <IfModule mod_headers.c>
     Header append Cache-Control "public, no-transform"
  </IfModule>

</IfModule>

【讨论】:

  • 我也没有任何帮助。 Header append Cache-Control "public, no-transform" 不考虑内容类型?
  • 请注意,在 Apache 2.2.12 之前,无法使用 Header 指令设置 Cache-Control 标头。
【解决方案3】:

如果要制作缓存的content-type可以这样输入:

<IfModule mod_expires.c>

ExpiresActive on

ExpiresByType text/html "access plus 15 days"

</IfModule>

【讨论】:

  • 这会设置ExpiresByType 标头。这不是我需要的。我需要能够通过内容类型设置Cache-Control
  • @JakeN "这设置了 ExpiresByType 标头。" - 我猜你的意思是Expires 标头,ExpiresByType 是 mod_expires 指令。但即使在 Apache 2.0 上,这也应该设置 Cache-Control 标头(通过 mime-type / Content-Type)。 AFAIK 您必须返回到 Apache 1.3 才能设置 Expires 标头。
猜你喜欢
  • 1970-01-01
  • 2013-12-10
  • 2015-05-05
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多