ExpiresByType和“标头设置内容类型”竞争条件

时间:2018-12-24 13:15:30

标签: apache configuration apache-config

ExpiresByType对根据Header set Content-Type规则设置其模仿类型的资产没有影响。

配置:

<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  Order allow,deny
  allow from all
  allowoverride none
  <FilesMatch "health$">
    Header set Content-Type "application/json"
  </FilesMatch>

  # enable expirations:
  ExpiresActive On
  ExpiresDefault "access plus 1 year"

  # expire json after shorter time:
  ExpiresByType application/json "access plus 1 minute"
</Directory>

所有json文件(扩展名)都获得了适当的Cache-Control: max-age=60标头集,但与health$匹配的所有文件都将接收默认的年份(31536000)值。我希望这些文件的过期时间也为1分钟,因为以前的规则将其内容类型设置为json。

看起来配置中有些竞争,即到期规则在标头设置之前执行。

1 个答案:

答案 0 :(得分:1)

这里没有竞赛,甚至没有任何不确定的顺序,到期的东西将始终在“ Header set”之前运行,因为执行此工作的模块如何向Apache核心注册。

要记住有助于在Apache中进行这类调查的一件事是,配置在启动时被读取并存储在相应的模块中,稍后将在请求处理期间调用该配置。换句话说,在配置文件中对来自不同模块的指令进行排序通常是没有意义的。有意义的是,在请求处理过程中,模块何时生效,查询其配置并进行更改。

在生成响应后,mod_headers和mod_expires都可以让您要求他们相对较晚地完成工作。为什么?因为它们都相对于其他响应头进行了更改。

如果这里的问题是如何获得某种替代行为,则部分取决于生成运行状况检查响应的原因(或特殊请求的内容)。

  • 如果它们是静态文件,则可以简单地使用ForceType,这会更早发生。
  • 如果它们以任何方式都是动态的,那么不幸的是,诸如ForceType或“ Header early set”之类的早期指令将被任何动态的东西覆盖,因为它认为它对所产生的内容了解更好的Content-Type。

动态文件的一种潜在的简单选择是在ExpiresDefault中使用FilesMatch