ExpiresByType & 'Header set Content-Type' 竞争条件

ExpiresByType & 'Header set Content-Type' race condition

ExpiresByType 对其 mimetype 由 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 header 设置,但所有匹配 health$ 的文件都会收到默认年份 (31536000)价值。我希望这些文件也能在 1 分钟内过期,因为之前的规则将它们的 content-type 设置为 json。

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

这里没有竞争,甚至没有任何未定义的排序,过期内容总是 "Header set" 之前 运行 秒,因为执行此工作的模块如何注册到 Apache 的核心.

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

mod_headers 和 mod_expires 运行 您要求他们完成的工作相对较晚,在生成响应之后。为什么?因为它们都相对于其他响应进行了更改 headers.

如果这里的问题是如何获得一些替代行为,它部分取决于什么产生健康检查的响应(或任何特殊请求)。

  • 如果它们是静态文件,您可以简单地使用 ForceType,这会发生得更早。
  • 如果它们在任何方面都是动态的,那么像 ForceType 或 "Header early set" 这样的早期指令将不幸地只是 over-written 任何动态的东西认为它知道更好的 Content-Type 它正在生产的东西.

动态文件的一个潜在的简单选项是在 FilesMatch.

中使用 ExpiresDefault