Перезаписать заголовки кэша с помощью mod_expires

#apache #mod-expires

#apache #mod-истекает

Вопрос:

Я хочу установить заголовки кэша с помощью модуля mod_expires от apache. Моя конфигурация выглядит примерно так:

 <LocationMatch ^/static >
    ExpiresDefault "access plus 1 years"
</LocationMatch>
  

Проблема в том, что файлы генерируются третьей системой, которую я не контролирую. Эта система предоставляет файлы со следующими заголовками:

 Date Mon, 24 Oct 2011 08:39:02 GMT
Cache-Control no-cache,no-store,must-revalidate
Pragma no-cache
Expires Thu, 01 Dec 1994 16:00:00 GMT
  

Эти заголовки делают невозможным установку заголовков кэша с помощью mod_expires. http://httpd.apache.org/docs/2.2/mod/mod_expires.html говорит нам, почему:

Когда заголовок Expires уже является частью ответа, сгенерированного сервером, например, когда он генерируется CGI-скриптом или проксируется с исходного сервера, этот модуль не изменяет и не добавляет заголовок Expires или Cache-Control.

Есть ли какой-либо возможный способ обойти это правило и перезаписать заголовки с помощью mod_expires ?

Обновление: одним из возможных решений, позволяющих избежать этого ограничения, является использование только mod_headers для установки заголовков кэша. К сожалению, это не альтернатива, потому что значения должны быть вычислены.

Заранее благодарю.

Ответ №1:

К сожалению, это известное ограничение, и нам пришлось вернуться к использованию only mod_headers .

Ответ №2:

Предложение Regilero не сработает, потому что директивы заголовка будут обработаны очень поздно в директиве обработки ответа — после mod_expire . Таким образом, вы бы сбросили заголовки после mod_expires того, как сделали (или не сделали) то, что он должен был делать.

Если это apache 2.2, вы можете попробовать поместить early в конце каждой директивы заголовка. Это подскажет ему сделать это на ранней стадии обработки ответа, а не в конце.

так что попробуйте:

 <LocationMatch ^/static >
  Header unset Cache-Control early
  Header unset Pragma early
  Header unset Expires early
  ExpiresDefault "access plus 1 years"
</LocationMatch>
  

Не тестировал, но попробуйте…

Ответ №3:

Вы пробовали смешивать его с mod_headers?

 <LocationMatch ^/static >
  Header unset Cache-Control 
  Header unset Pragma
  Header unset Expires 
  ExpiresDefault "access plus 1 years"
</LocationMatch>
  

Не проверено, но в случае…

Комментарии:

1. Мх, это не сработало. Он удаляет только заголовки. ExpiresDefault не имеет никакого эффекта.

2. шеффилд: хорошо, это половина шагов 🙂 Возможно, вы все равно могли бы использовать инструкции модуля заголовка для отправки новых заголовков, а не модуля Expires . Если вам нужна только эта настройка по умолчанию и нет ExpiresByType, это может сработать.

3. это не альтернатива для использования, потому access что предложение должно быть вычислено.

4. @scheffield Вы когда-нибудь исправляли это?

5. Нет, это известное ограничение, и нам пришлось вернуться к использованию только mod_headers .