ExpiresByType & 'Header set Content-Type' условие гонки - PullRequest
0 голосов
/ 24 декабря 2018

ExpiresByType не влияет на активы, чей mimetype установлен по правилу Header set Content-Type.

Config:

<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 голосов
/ 24 декабря 2018

Здесь нет гонки или даже какого-либо неопределенного порядка, срок действия всегда будет запускаться перед «набором заголовков» из-за того, как модули, выполняющие эту работу, регистрируются в ядре Apache.

OneСледует помнить, что подобные исследования в Apache помогают в том, что конфигурация считывается при запуске и сохраняется в соответствующих модулях, которые впоследствии будут вызываться во время обработки запроса.Другими словами, упорядочивать в конфигурационном файле директивы из разных модулей обычно бессмысленно.Что имеет значение, так это то, что во время обработки запроса модуль оживает, проверяет свою конфигурацию и вносит изменения.

И mod_headers, и mod_expires выполняют работу, которую вы просите их, относительно поздно, после того, как ответ былгенерироваться.Зачем?Поскольку оба они вносят изменения относительно других заголовков ответа.

Если вопрос здесь заключался в том, как получить какое-либо альтернативное поведение, это частично зависит от того, что создает ответ для проверок работоспособности (или какими бы то ни было специальные запросы).

  • Если это статические файлы, вы можете просто использовать ForceType, что произошло бы намного раньше.
  • Если они каким-либо образом являются динамическими, ранние директивы, такие как ForceType или «Ранний набор заголовков», к сожалению, будут просто перезаписаны любой динамической вещью, которая думает, что знает лучший Content-Type для того, что она производит.

Одним из возможных простых вариантов для динамических файлов будет использование ExpiresDefault в FilesMatch.

...